Eu tenho uma função que leva dois argumentos:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
E uma variável que deve encaminhar seus argumentos em pares:
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
}
Eu gostaria bar(1,2,3,4)
de ligar foo(1,2)
efoo(3,4)
Existe uma maneira de fazer isso?
c++
c++11
templates
variadic-templates
Fourmet
fonte
fonte
Respostas:
Você pode fazer isso com sobrecargas.
VIVER
Observe que, com o snippet mínimo acima, ao chamar
bar
com 0 ou argumentos ímpares, você não receberá nenhum erro de função correspondente . Se você quiser uma mensagem de compilação mais clara,static_assert
pode começar com esse trecho .fonte
Recursão simples usando
if constexpr
:Chame assim:
Demo
Eu diria que a resposta de songyanyao é bastante canônica antes do C ++ 17. Depois,
if constexpr
nos permitiu mover a lógica para os corpos de nossas funções, em vez de usar truques de sobrecarga.fonte
Generalização do C ++ 17 para
n
functores -ary:fonte