Je suis en train de faire quelque chose de similaire à C++11 variable number of arguments, same specific type, mais j'ai mon propre type:nombre variable d'arguments, même type spécifique sans macro ou initialiseur liste
struct Foo
{
Foo(int) {}
Foo(int, int) {}
};
avec un tas de
surchargevoid f() {}
void f(const Foo&) {}
void f(const Foo&, const Foo&) {}
// etc. ... as many f() overloads as needed ...
fonctionne comme vous le souhaitez: f(); f(1); f(1, 2); f(1, { 2, 3 });
.
Au lieu de surcharge, je peux aussi utiliser std::initializer_list<>
avec la syntaxe {}
(comme suggéré here):
void g_(std::initializer_list<Foo>) {}
g_({}); g_({ 1 }); g_({ 1, 2 }); g_({ 1, { 2, 3 } });
mais qui a un ensemble de {}
(oui, il est juste deux caractères) supplémentaires. Pour correspondre à la syntaxe de f()
exactement, utilisez une macro.
#define g(...) g_({__VA_ARGS__})
g(); g(1); g(1, 2); g(1,{ 2, 3 });
(Adaptation de la syntaxe de f()
exactement pourrait être nécessaire en raison de l'héritage ou le code généré ... et it- arguably -Juste « semble mieux ».)
mais je ne peux pas trouver un moyen de faire un travail de modèle variadique
void h() { }
template<typename... T>
void h(const Foo&, T...) { }
h()
, h(1)
et h(1, 2)
travail, mais ne parvient pas à h(1, {2, 3})
compiler parce que le compilateur ne peut pas comprendre le type de {2, 3}
comme il le peut avec f()
et g_()
.
Existe-t-il un moyen de faire fonctionner f()
sans plusieurs surcharges? Ou pour g()
de travailler sans macro? g()
est très à proximité (une seule fonction et pas de magie de modèle), mais il y a cette macro ...
Où tracez-vous la ligne sur les surcharges "multiples"? En avoir deux ok? Les variadiques sont souvent associés à la récursion, où vous avez besoin d'au moins deux (le cas de récursivité et le cas de base) –
@BenVoigt "unlimited"; 'g()' serait ma solution préférée s'il n'y avait pas de macro. (Légères modifications pour clarifier cela.) –
'{2, 3}' n'a aucun type, et ne peut donc pas être déduit par déduction de modèle. – Jarod42