Maison > développement back-end > C++ > Pourquoi les spécialisations partielles des modèles de fonctions sont-elles interdites en C ?

Pourquoi les spécialisations partielles des modèles de fonctions sont-elles interdites en C ?

Susan Sarandon
Libérer: 2024-12-06 01:50:11
original
763 Les gens l'ont consulté

Why are Partial Specializations of Function Templates Prohibited in C  ?

Spécialisation partielle des modèles de fonctions : pourquoi pas ?

Il est bien connu que la spécification du langage C interdit la spécialisation partielle des modèles de fonctions. Cette décision a intrigué de nombreux développeurs, qui remettent en question son utilité et sa justification.

La spécification du langage interdit la spécialisation partielle des modèles de fonctions en raison d'un oubli. La flexibilité offerte par la spécialisation partielle peut être obtenue grâce à des techniques alternatives, telles que la définition de la fonction en tant que membre statique d'une classe.

Par exemple, considérons le code suivant :

template<typename T, typename U> void f() {}   //allowed!
template<> void f<int, char>()            {}   //allowed!
template<typename T> void f<char, T>()    {}   //not allowed!
template<typename T> void f<T, int>()     {}   //not allowed!
Copier après la connexion

While la spécialisation partielle de f n'est pas autorisée, nous pouvons obtenir un effet similaire en définissant la fonction comme membre statique d'une classe :

void say( char const s[] ) { std::cout << s << std::endl; }

namespace detail {
    template< class T, class U >
    struct F {
        static void impl() { say( "1. primary template" ); }
    };

    template<>
    struct F<int, char> {
        static void impl() { say( "2. <int, char> explicit specialization" ); }
    };

    template< class T >
    struct F< char, T > {
        static void impl() { say( "3. <char, T> partial specialization" ); }
    };

    template< class T >
    struct F< T, int > {
        static void impl() { say( "4. <T, int> partial specialization" ); }
    };
}  // namespace detail

template< class T, class U >
void f() { detail::F<T, U>::impl(); }    

int main() {
    f<char const*, double>();       // 1
    f<int, char>();                 // 2
    f<char, double>();              // 3
    f<double, int>();               // 4
}
Copier après la connexion

Ce code se comporte de la même manière que la spécialisation partielle de f. spécialisation des modèles de fonctions, fournissant un mécanisme permettant de définir des implémentations spécialisées pour des combinaisons d'arguments spécifiques.

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