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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-27 17:46:14856parcourir

How to Explicitly Specialize a Template Function Within a Template Class in C  ?

Spécialisation explicite d'une fonction de modèle dans une classe de modèle

En C, la spécialisation explicite d'une fonction de modèle au sein d'une classe de modèle peut être délicate problème de syntaxe. Considérez l'extrait de 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
};

Dans cet exemple, le compilateur génère une erreur lorsqu'il tente de spécialiser explicitement la fonction membre f avec la balise tag. Pour résoudre ce problème, il est nécessaire de déplacer la spécialisation explicite en dehors de la classe, mais la syntaxe appropriée n'est pas immédiatement évidente.

La solution fournie suggère d'utiliser une structure d'assistance avec des fonctions de membre statiques pour transférer les appels vers le membre spécialisé. function :

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);
    }
};

Avec cette approche, la spécialisation explicite est contenue dans une structure non imbriquée, satisfaisant aux exigences de la syntaxe de spécialisation explicite.

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