Maison >développement back-end >C++ >Devriez-vous éviter `std::enable_if` dans les signatures de fonction ?

Devriez-vous éviter `std::enable_if` dans les signatures de fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 05:57:30996parcourir

Should You Avoid `std::enable_if` in Function Signatures?

Déficience procédurale : é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.

Méthodes d'emploi de std::enable_if dans les signatures de fonction

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>

Approche recommandée : placement dans les paramètres du modèle

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!

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