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
Susan Sarandonoriginal
2024-11-05 20:30:02617parcourir

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>

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>

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>

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>

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>

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