Maison  >  Article  >  développement back-end  >  Pouvez-vous spécialiser partiellement les fonctions membres dans les modèles C ?

Pouvez-vous spécialiser partiellement les fonctions membres dans les modèles C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 18:26:02791parcourir

Can You Partially Specialize Member Functions in C   Templates?

Spécialisation partielle des fonctions des membres de modèles

En C , il n'est pas possible de spécialiser partiellement les membres individuels d'une classe de modèle. Une spécialisation de modèle doit spécifier tous les paramètres du modèle.

Par exemple, le code suivant n'est pas valide :

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

template <typename T> // Only specializes for bool type
void X<T>::Specialized()
{
    ...
}

template <typename T> // Only specializes for float type
void X<T>::Specialized()
{
    ...
}</code>

Solutions de contournement

Il existe plusieurs solutions de contournement pour obtenir le comportement souhaité :

  • Spécialisation explicite :
    Vous pouvez spécialiser explicitement l'ensemble de la classe de modèle pour chaque combinaison souhaitée d'arguments de modèle. Par exemple :

    <code class="cpp">template <>
    void X<int, true>::Specialized()
    {
        ...
    }
    
    template <>
    void X<float, false>::Specialized()
    {
        ...
    }</code>
  • Fonctions surchargées :
    Vous pouvez définir des fonctions surchargées avec le même nom dans la classe de modèle et utiliser des arguments de modèle pour différencier les eux. Par exemple :

    <code class="cpp">template <typename T>
    struct X
    {
        void Specialized(bool b)
        {
            SpecializedImpl(i2t<b>());
        }
    
    private:
        void SpecializedImpl(i2t<true>)
        {
            ...
        }
    
        void SpecializedImpl(i2t<false>)
        {
            ...
        }
    };</code>

    En transmettant une valeur booléenne à la fonction surchargée, vous pouvez obtenir une spécialisation partielle pour cette fonction membre spécifique.

  • Modèles paramétrés :
    Vous pouvez définir une classe de modèle distincte pour implémenter le comportement souhaité en fonction des paramètres du modèle. Par exemple :

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

    Le modèle SpecializedImpl est paramétré à la fois par T et B, vous permettant de le spécialiser en fonction de valeurs spécifiques de ces paramètres.

Le choix La solution de contournement à utiliser dépend des exigences spécifiques du code et des préférences 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