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
Barbara Streisandoriginal
2024-12-07 15:13:11983parcourir

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

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>()
{
}

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

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!

Déclaration:
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