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

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

Patricia Arquette
Libérer: 2024-12-27 22:47:10
original
592 Les gens l'ont consulté

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

Classe de modèle avec fonction membre explicitement spécialisée

Lors de la définition d'une spécialisation explicite pour une fonction membre d'un modèle de classe, un piège courant se produit lorsque le modèle de classe environnant est également un modèle. Pour comprendre le problème, considérons l'exemple suivant :

#include <iostream>
#include <cmath>

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

template <class C>
void X<C>::get_as<double>() {}  // Explicit specialization for double

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

Ce code tente de spécialiser explicitement la fonction membre get_as pour double pour le modèle de classe X. Cependant, cette approche entraîne des erreurs de compilation car le modèle de classe environnant n'est pas explicitement spécialisé.

Approche incorrecte :

Tentative de spécialisation explicite de la fonction membre sans spécialiser la classe le modèle, comme indiqué ci-dessous, est incorrect :

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

Correct Solution :

Pour résoudre le problème, le modèle de classe et la fonction membre doivent être explicitement spécialisés. Par exemple, pour spécialiser la fonction get_as uniquement pour X, utilisez l'approche suivante :

template <>
template <class T>
void X<int>::get_as() {}

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

Option alternative :

Alternativement, pour conserver l'environnement modèle de classe non spécialisé, une surcharge de la fonction get_as peut être utilisée, comme démontré dans 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

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