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
Patricia Arquetteoriginal
2024-12-27 22:47:10594parcourir

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

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

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

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

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