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
Libérer: 2024-12-03 01:33:14
original
155 Les gens l'ont consulté

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>()
{
}
Copier après la connexion

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>'
Copier après la connexion

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>()
{
}
Copier après la connexion

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>) {
   }
};
Copier après la connexion

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!

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