Maison >développement back-end >C++ >Comment spécialiser correctement et explicitement les fonctions membres dans les classes basées sur un modèle ?

Comment spécialiser correctement et explicitement les fonctions membres dans les classes basées sur un modèle ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 01:33:14159parcourir

How to Correctly Explicitly Specialize Member Functions in Templated Classes?

Spécialisation explicite des fonctions membres dans les modèles de classe

Lorsque vous travaillez avec des modèles de classe, la spécialisation explicite des fonctions membres est une exigence courante. Cependant, dans les cas où le modèle de classe lui-même devient un modèle, des erreurs peuvent survenir en raison d'une approche incorrecte.

Considérez le scénario suivant :

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

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

Ce code tente de spécialiser explicitement un membre fonction du modèle de classe X pour le type double. Cependant, lorsque X lui-même devient un modèle, le compilateur signale des erreurs :

error: template-id 'get_as<double>' in declaration of primary template
error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>'

La solution consiste également à spécialiser explicitement le modèle de classe environnant. Cela peut être fait en ajoutant un argument de modèle vide à la définition de membre spécialisée :

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

Cela spécialisera la fonction membre uniquement pour X.

Alternativement, il est possible d'utiliser surcharges pour obtenir le comportement souhaité :

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 approche repose sur la spécialisation des modèles pour sélectionner la surcharge get_as() appropriée, garantissant que la spécialisation de type double est appliquée comme prévu.

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