0
votes

Méthode de modèle variadique

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> xxx

et quand je veux compiler, je reçois ces erreurs, "ambigu": xxx


0 commentaires

3 Réponses :


2
votes

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...>();
}


0 commentaires

1
votes

in c ++ 17 Ceci est assez simple: xxx pré>

in c ++ 11 Vous pouvez le faire: p> xxx pré>

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>{}...);
    }
};


0 commentaires

1
votes

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> xxx pré>

Démo P>

ou P>

template<typename ... Ts>
void method()
{
    std::initializer_list<int>{0, ((std::cout << typeid(Ts).name() << std::endl), 0)...};
}


0 commentaires