"Implicitement" est la bonne réponse. Les modèles de façon à créer un "duck typing" scénario, en raison de la façon dont ils sont calculés. Vous pouvez appeler toutes les fonctions que vous voulez sur un modèle de type de valeur, et la seule instanciations qui seront acceptés sont ceux pour lesquels cette méthode est définie. Par exemple:
template <class T>
int compute_length(T *value)
{
return value->length();
}
Nous pouvons appeler cette méthode sur un pointeur vers n'importe quel type qui déclare l' length()
méthode de retour d'un int
. Ainsi:
string s = "test";
vector<int> vec;
int i = 0;
compute_length(&s);
compute_length(&vec);
...mais pas sur un pointeur sur un type qui ne veut pas déclarer length()
:
compute_length(&i);
Ce troisième exemple ne compilera pas.
Cela fonctionne parce que le C++ compile une nouvelle version de la templatized fonction (ou une classe) pour chaque instanciation. Qu'il effectue cette compilation, il fait un direct, presque macro-comme la substitution de l'instanciation du modèle dans le code avant la vérification de type. Si tout fonctionne encore avec ce modèle, puis la compilation produit et nous avons fini par arriver à un résultat. Si quelque chose tombe en panne (comme int*
de ne pas déclarer length()
), alors nous obtenons la redoutable six modèle de page erreur de compilation.