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 ?