Je voudrais créer une méthode de classe qui prend un argument variadique (dans le modèle), puis les utiliser pour obtenir (par exemple) le nom de l'argument transmis.
J'ai essayé de mettre en œuvre (mais cela ne fonctionne pas): < / p> et quand je veux compiler, je reçois ces erreurs, "ambigu": p>
3 Réponses :
Vous pouvez utiliser Sfinae pour désactiver la version variable lorsque le pack de paramètres est vide:
template<typename T, typename ...Targs, std::enable_if_t<sizeof...(Targs) != 0>* = nullptr> void method() { method<T>(); method<Targs...>(); }
in c ++ 17 Ceci est assez simple: in c ++ 11 Vous pouvez le faire: p> avec Une légère modification des paquets vides peut être traitée automatiquement: P> class Test {
template<class> struct Tag {};
void method_impl() { }
template<typename T, typename... Ts>
void method_impl(Tag<T>, Tag<Ts>... tags) {
std::cout << typeid(T).name() << std::endl;
method_impl(tags...);
}
public:
template<typename... Ts>
void method() {
method_impl(Tag<Ts>{}...);
}
};
argument de la fonction permet de sélectionner la surcharge et non des paramètres de modèle.
Une solution est de Turm votre argument de modèle dans les paramètres: P> ou P> template<typename ... Ts>
void method()
{
std::initializer_list<int>{0, ((std::cout << typeid(Ts).name() << std::endl), 0)...};
}