Quelle est cette construction: template <int> void funcName (int i)?

Oct 02 2020

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

6 cigien Oct 02 2020 at 02:15

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

3 RSahu Oct 02 2020 at 02:15

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);