J'ai une fonction qui prend deux arguments:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
Et un variadic qui devrait transmettre ses arguments par paires:
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
}
je voudrais bar(1,2,3,4)
appeler foo(1,2)
etfoo(3,4)
Y-a-t-il un moyen de faire ça ?
c++
c++11
templates
variadic-templates
Fourmet
la source
la source
Réponses:
Vous pouvez l'accomplir avec des surcharges.
VIVRE
Notez qu'avec l'extrait de code minimum ci-dessus lorsque vous appelez
bar
avec 0 ou des arguments impairs, vous n'obtiendrez aucune erreur de fonction correspondante . Si vous voulez un message de compilation plus clair avecstatic_assert
vous pouvez commencer à partir de cet extrait .la source
Récursivité simple utilisant
if constexpr
:Appelez-le ainsi:
Démo
Je dirais que la réponse de songyanyao est assez canonique pré-C ++ 17. Ensuite, cela
if constexpr
nous a permis de déplacer la logique dans le corps de nos fonctions au lieu d'utiliser des astuces de surcharge.la source
Généralisation C ++ 17 pour les
n
foncteurs -ary:la source