Mam funkcję, która przyjmuje dwa argumenty:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
I variadic, który powinien przekazywać swoje argumenty parami:
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
}
Chciałbym bar(1,2,3,4)
zadzwonić foo(1,2)
ifoo(3,4)
Czy jest na to sposób?
c++
c++11
templates
variadic-templates
Fourmet
źródło
źródło
Odpowiedzi:
Możesz to zrobić z przeciążeniami.
RELACJA NA ŻYWO
Zauważ, że przy minimalnym fragmencie powyżej podczas wywoływania
bar
z argumentami 0 lub nieparzystymi nie pojawi się błąd pasującej funkcji . Jeśli chcesz uzyskać bardziej przejrzysty komunikat kompilacjistatic_assert
, możesz zacząć od tego fragmentu .źródło
Prosta rekurencja za pomocą
if constexpr
:Nazwij to tak:
Próbny
Powiedziałbym, że odpowiedź songyanyao jest dość kanoniczna przed C ++ 17. Następnie
if constexpr
pozwoliło nam przenieść logikę do ciał naszych funkcji zamiast używania przeciążających sztuczek.źródło
Uogólnienie C ++ 17 dla
n
funktorów -ary:źródło