Tengo una función que toma dos argumentos:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
Y una variable que debe reenviar sus argumentos en 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
}
Querría bar(1,2,3,4)
llamar foo(1,2)
yfoo(3,4)
Hay una manera de hacerlo ?
c++
c++11
templates
variadic-templates
Fourmet
fuente
fuente
Respuestas:
Puedes lograrlo con sobrecargas.
EN VIVO
Tenga en cuenta que con el fragmento mínimo anterior al llamar
bar
con 0 o argumentos impares no obtendrá un error de función coincidente . Si desea un mensaje de compilación más clarostatic_assert
, puede comenzar desde este fragmento .fuente
Recurrencia simple usando
if constexpr
:Llámalo así:
Manifestación
Yo diría que la respuesta de songyanyao es bastante canónica antes de C ++ 17. Posteriormente,
if constexpr
nos ha permitido mover la lógica a los cuerpos de nuestras funciones en lugar de usar trucos de sobrecarga.fuente
Generalización de C ++ 17 para
n
funarios de canario:fuente