Spécialisation explicite de la fonction de modèle dans la classe de modèle en C
En C, lorsque vous travaillez avec des classes et des fonctions de modèle, il peut être nécessaire de spécialiser explicitement une fonction de modèle dans une classe de modèle. Cependant, trouver la syntaxe correcte pour cela peut être difficile.
Considérez le code suivant :
struct tag {}; template< typename T > struct C { template< typename Tag > void f( T ); // declaration only template<> inline void f< tag >( T ) {} // ERROR: explicit specialization in non-namespace scope };
Ce code, qui se compile avec succès dans Visual C 2008 mais échoue dans GCC 4.2, tente de spécialisez explicitement la fonction f pour le type de balise dans la classe de modèle C. L'erreur du compilateur indique que la spécialisation explicite n'est pas autorisée dans une portée non-espace de noms au sein de la classe modèle.
La manière correcte de spécialiser explicitement une fonction modèle dans une classe modèle consiste à transférer les appels vers une fonction membre d'un type partiellement spécialisé. Cela peut être fait en utilisant une classe d'assistance :
template<class T, class Tag> struct helper { static void f(T); }; template<class T> struct helper<T, tag1> { static void f(T) {} }; template<class T> struct C { // ... template<class Tag> void foo(T t) { helper<T, Tag>::f(t); } };
Dans ce code, helper est une classe de modèle avec deux paramètres de modèle : T (le type de l'objet sur lequel l'opération est opérée) et Tag (la balise de spécialisation) . Une version partiellement spécialisée de helper est définie pour la spécialisation tag1, qui fournit l'implémentation de la fonction f. La classe de modèle C utilise ensuite une fonction membre foo pour déléguer les appels à la fonction helper
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!