Maison > développement back-end > C++ > Les fonctions membres de la classe modèle peuvent-elles être partiellement spécialisées ?

Les fonctions membres de la classe modèle peuvent-elles être partiellement spécialisées ?

Susan Sarandon
Libérer: 2024-11-05 20:30:02
original
651 Les gens l'ont consulté

Can Template Class Member Functions be Partially Specialized?

Spécialisation partielle des membres d'une classe modèle

Est-il possible de spécialiser des membres spécifiques d'une classe modèle ? Par exemple :

<code class="cpp">template <typename T, bool B>
struct X
{
    void Specialized();
};

template <typename T>
void X<T, true>::Specialized()
{
    // ...
}

template <typename T>
void X<T, false>::Specialized()
{
    // ...
}</code>
Copier après la connexion

Réponse :

La spécialisation partielle directe des fonctions membres au sein d'un modèle de classe n'est pas autorisée. Cependant, des spécialisations complètes peuvent être fournies :

<code class="cpp">template <>
void X<int, true>::Specialized()
{
    // ...
}</code>
Copier après la connexion

Solutions de contournement :

1. Fonctions surchargées :

En introduisant des surcharges de fonctions membres, vous pouvez obtenir un effet similaire tout en conservant l'accès aux membres de la classe :

<code class="cpp">template <typename T, bool B>
struct X
{
    void Specialized() { SpecializedImpl(i2t<B>()); }

private:
    void SpecializedImpl(i2t<true>) { 
      // ...
    }

    void SpecializedImpl(i2t<false>) { 
      // ...
    }
};</code>
Copier après la connexion

2. S'en remettre au modèle de classe :

Une autre option consiste à définir un modèle de classe distinct pour les implémentations spécialisées :

<code class="cpp">template <typename T, bool B>
void X::Specialized() { SpecializedImpl<T, B>::call(); }</code>
Copier après la connexion

3. SpecializedImpl pour la surcharge de fonctions :

Cette approche émule l'approche i2t mais permet une spécialisation de paramètres arbitraires :

<code class="cpp">template <typename T, bool B>
struct X
{
    void Specialized() { Specialized(SpecializedImpl<T, B>()); }

private:
    template <typename U>
    void Specialized(SpecializedImpl<U, true>) { // ... }

    template <typename U>
    void Specialized(SpecializedImpl<U, false>) { // ... }
};</code>
Copier après la connexion

Conclusion :

Bien qu'une spécialisation partielle directe des fonctions membres ne soit pas possible, ces solutions de contournement offrent des alternatives efficaces pour obtenir des fonctionnalités similaires. Le choix de l'approche dépend des exigences et préférences spécifiques du développeur.

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 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