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!
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 }
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!