3 votes

Variantes de modèles en C++

Peut-on utiliser une variante de modèle pour attraper tous les cas où un paramètre de modèle qui est lui-même un modèle est transmis ?

J'ai utilisé le templating pour produire une sortie de débogage pour certaines méthodes basées sur des templates. Tout d'abord, j'ai créé un gestionnaire générique, puis je l'ai spécialisé pour les types natifs :

template<typename... PARAMS> struct TypeList{};

template<typename TYPE> inline void ntype(ostream &out, TypeList<TYPE>) {
    out << typeid(TYPE).name();
}

template<> inline void ntype(ostream &out, TypeList<int>) {
    out << "int";
}

...

J'ai ensuite essayé d'ajouter un deuxième format de modèle pour détecter les types de modèles transmis :

template<typename ... SUB, template<typename...> class TYPE> void ntype(ostream &out, TypeList<TYPE<SUB...> >) {
    ntype(out, TypeList<typename TYPE>());
    out << '<';
    subtype(out, TypeList<SUB...>());
    out << '>';
}

Où sous-type est une méthode modèle conçue pour parcourir la liste des paramètres, en appliquant tour à tour ntype() à chacun d'entre eux.

Le problème se pose lorsque j'essaie de l'appeler avec quelque chose du genre :

ntype<SomeClass<int> >(out, TypeList<SomeClass<int> >());

Il ne correspond jamais qu'à la première fonction générique du modèle - pas d'erreur de compilation, mais il ne correspond jamais à la version du modèle. Je suis sûr que c'est simplement un manque de compréhension de ma part, mais les résultats de Google semblent très minces sur le terrain quand il s'agit d'exemples clairs de modèles, et encore plus minces en ce qui concerne les paramètres variables des modèles.

Quelqu'un peut-il m'expliquer si ce que je tente est possible et, le cas échéant, ce que je fais de travers ?

1voto

jka6510 Points 656

Il s'avère que j'ai simplement fait une faute de frappe - j'avais ajouté () après l'une de mes TypeLists dans une déclaration de fonction, probablement à la suite d'un copier-coller d'une invocation de fonction à 3 heures du matin, ce qui a provoqué la non-concordance.

Donc, au cas où quelqu'un se poserait la question, oui, c'est possible, et la méthode décrite ci-dessus est tout à fait acceptable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X