Ich habe eine Funktion, die zwei Argumente akzeptiert:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
Und eine Variante, die ihre Argumente paarweise weiterleiten sollte:
template <typename... Args>
void bar(Args&&... args) {
static_assert(sizeof...(Args) % 2 == 0);
( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... );
// ^ Sends each argument twice, not in pairs
}
Ich würde gerne bar(1,2,3,4)
anrufen foo(1,2)
undfoo(3,4)
Gibt es eine Möglichkeit, das zu tun?
c++
c++11
templates
variadic-templates
Fourmet
quelle
quelle
Antworten:
Sie können dies mit Überlastungen erreichen.
LEBEN
Beachten Sie, dass mit dem oben angegebenen minimalen Snippet beim Aufrufen
bar
mit 0 oder ungeraden Argumenten kein übereinstimmender Funktionsfehler angezeigt wird. Wenn Sie eine klarere Kompilierungsnachricht wünschen,static_assert
können Sie mit diesem Snippet beginnen .quelle
Einfache Rekursion mit
if constexpr
:Nennen Sie es so:
Demo
Ich würde sagen, dass die Antwort von songyanyao vor C ++ 17 ziemlich kanonisch ist. Danach
if constexpr
haben wir die Logik in die Körper unserer Funktionen verschoben, anstatt Überladungstricks anzuwenden.quelle
C ++ 17-Verallgemeinerung für
n
-ary-Funktoren:quelle