Maison > développement back-end > C++ > Comment spécialiser correctement et explicitement une fonction de modèle dans une classe de modèle C ?

Comment spécialiser correctement et explicitement une fonction de modèle dans une classe de modèle C ?

Barbara Streisand
Libérer: 2024-12-05 18:11:11
original
993 Les gens l'ont consulté

How to Correctly Explicitly Specialize a Template Function within a C   Template Class?

Spécialisation explicite de la fonction de modèle dans la classe de modèle en C

En C, lorsque vous travaillez avec des classes et des fonctions de modèle, il peut être nécessaire de spécialiser explicitement une fonction de modèle dans une classe de modèle. Cependant, trouver la syntaxe correcte pour cela peut être difficile.

Considérez le code suivant :

struct tag {};

template< typename T >
struct C
{   
    template< typename Tag >
    void f( T );                 // declaration only

    template<>
    inline void f< tag >( T ) {} // ERROR: explicit specialization in non-namespace scope
};
Copier après la connexion

Ce code, qui se compile avec succès dans Visual C 2008 mais échoue dans GCC 4.2, tente de spécialisez explicitement la fonction f pour le type de balise dans la classe de modèle C. L'erreur du compilateur indique que la spécialisation explicite n'est pas autorisée dans une portée non-espace de noms au sein de la classe modèle.

La manière correcte de spécialiser explicitement une fonction modèle dans une classe modèle consiste à transférer les appels vers une fonction membre d'un type partiellement spécialisé. Cela peut être fait en utilisant une classe d'assistance :

template<class T, class Tag>
struct helper {
    static void f(T);   
};

template<class T>
struct helper<T, tag1> {
    static void f(T) {}
};

template<class T>
struct C {
    // ...
    template<class Tag>
    void foo(T t) {
        helper<T, Tag>::f(t);
    }
};
Copier après la connexion

Dans ce code, helper est une classe de modèle avec deux paramètres de modèle : T (le type de l'objet sur lequel l'opération est opérée) et Tag (la balise de spécialisation) . Une version partiellement spécialisée de helper est définie pour la spécialisation tag1, qui fournit l'implémentation de la fonction f. La classe de modèle C utilise ensuite une fonction membre foo pour déléguer les appels à la fonction helper::f appropriée en fonction de la balise spécifiée.

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