Maison > développement back-end > C++ > Comment spécialiser explicitement une fonction membre d'un modèle de classe ?

Comment spécialiser explicitement une fonction membre d'un modèle de classe ?

Barbara Streisand
Libérer: 2024-12-07 15:13:11
original
935 Les gens l'ont consulté

How to Explicitly Specialize a Member Function of a Class Template?

Spécialisation explicite d'une fonction membre pour un modèle de classe

Énoncé du problème :

Quand définissant une spécialisation explicite d'une fonction membre pour un modèle de classe, il faut également spécialiser explicitement le modèle de classe environnant pour éviter le compilateur erreurs.

Exemple de code :

Considérez l'extrait de code suivant :

template <class C> class X
{
public:
   template <class T> void get_as();
};

template <class C>
void X<C>::get_as<double>()
{
}

int main()
{
   X<int> x;
   x.get_as();
}
Copier après la connexion

Ce code déclenche des erreurs du compilateur car le modèle de classe environnant X est pas explicitement spécialisé.

Solution :

À pour résoudre ce problème, nous devons explicitement spécialiser le modèle de classe environnant, comme indiqué ci-dessous :

template <> template <>
void X<int>::get_as<double>()
{
}
Copier après la connexion

Cette fonction membre spécialisée s'applique uniquement à X et non à d'autres instanciations de X.

Approche alternative :

Une approche alternative consiste à utiliser des surcharges de fonctions, comme le montre le code suivant :

template <class C> class X
{
   template<typename T> struct type { };

public:
   template <class T> void get_as() { get_as(type<T>()); }

private:
   template<typename T> void get_as(type<T>) {}

   void get_as(type<double>) {}
};
Copier après la connexion

Cette méthode permet une spécialisation explicite sans nécessiter que le modèle de classe environnant soit spécialisé.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal