Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-06 18:26:02
original
790 Les gens l'ont consulté

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

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

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

    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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!