Maison >développement back-end >C++ >Devriez-vous éviter `std::enable_if` dans les signatures de fonction ?
Le prochain livre de Scott Meyers, EC 11, conseille d'éviter std::enable_if dans les signatures de fonction. Malgré sa polyvalence dans la suppression conditionnelle de fonctions ou de classes de la résolution de surcharge, certaines limitations et problèmes de lisibilité justifient un réexamen de son utilisation.
Fonction Paramètre :
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< // Option 1: As function parameter std::is_same<U, int>::value >::type* = 0) { return 42; } };</code>
Paramètre du modèle :
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< // Option 2: As template parameter std::is_same<U, int>::value, int >::type = 0> U read() { return 42; } };</code>
Type de retour :
<code class="cpp">template<typename T> struct Check3 { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value, U>::type read() { // Option 3: As return type return 42; } };</code>
La solution optimale consiste à placer le activate_if dans les paramètres du modèle. Cette approche offre plusieurs avantages :
Amélioration de la lisibilité :
L'utilisation d'enable_if est séparée des types de retour/argument, améliorant la clarté et réduisant l'encombrement.
Applicabilité universelle :
Contrairement aux autres options, le placement des paramètres du modèle est applicable aux constructeurs et aux opérateurs sans arguments supplémentaires.
Exclusion du type de retour :
Alors que "Éviter std::enable_if dans les signatures de fonction" concerne principalement son utilisation dans les signatures de fonctions normales, il s'applique aux types de retour dans les spécialisations de modèles. Le problème vient de problèmes de lisibilité lors de la fusion de activate_if avec les types de retour.
Fonctions membres et non membres :
Le principe est vrai pour les modèles de fonctions membres et non membres.
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!