Quelle est cette construction: template <int> void funcName (int i)?
J'ai accidentellement commis une erreur en codant une spécialisation de fonction de modèle, et la construction résultante a réussi la compilation avec VS17. (La troisième construction dans le code inclus ci-dessous)
Est-ce une construction valide? Comment appeler cette fonction?
template <class T> void tempfunc(T t)
{
cout << "Generic Template Version\n";
}
template <>
void tempfunc<int>(int i) {
cout << "Template Specialization Version\n";
}
template <int> void tempfunc(int i)
{
cout << "Coding Mistake Version\n";
}
Je n'ai pas pu appeler la troisième construction.
Réponses
Oui, c'est une construction valide. C'est une surcharge de modèle, qui est basée sur un paramètre de modèle non type de type int.
Vous pouvez l'appeler comme ceci:
tempfunc<42>(42);
Notez que les appels sans la syntaxe du modèle appelleront toujours les versions qui sont basées sur un paramètre de type:
tempfunc(42); // calls specialization
tempfunc(true); // calls primary
Voici une démo
template les paramètres sont de deux types - les paramètres de type et les paramètres non de type.
Lorsque vous utilisez
template <class T> void tempfunc(T t) { ... }
le templateparamètre est un paramètre de type. Pour utiliser un tel modèle, le type doit être déduit ou fourni explicitement.
Lorsque vous utilisez
template <int> void tempfunc(int i) { ... }
le templateparamètre est un paramètre non-type. Autant que je sache, la valeur d'un paramètre non-type ne peut pas être déduite. Il doit être explicitement fourni.
Le dernier templateutilise un paramètre non type. La valeur avec laquelle il peut être appelé doit être de type int. Exemples d'appels:
tempfunc<0>(20);
tempfunc<999>(34);