Maison > développement back-end > C++ > Comment fonctionne « std::enable_if » : percer les mystères de sa mise en œuvre et de son utilisation ?

Comment fonctionne « std::enable_if » : percer les mystères de sa mise en œuvre et de son utilisation ?

Barbara Streisand
Libérer: 2024-11-05 07:52:02
original
826 Les gens l'ont consulté

How Does `std::enable_if` Work: Unraveling the Mysteries of Its Implementation and Usage?

Comprendre std::enable_if : déchiffrer son objectif et sa mise en œuvre

Bien que la nature de std::enable_if soit comprise dans certains contextes, son Les subtilités, en particulier le deuxième argument et l'affectation à std::enable_if dans l'instruction modèle, restent énigmatiques. En approfondissant son fonctionnement, nous percerons ces mystères.

Les éléments essentiels de std::enable_if

std::enable_if est un modèle spécialisé défini comme suit :

<code class="cpp">template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };</code>
Copier après la connexion

Essentiellement, le type alias typedef T type n'est défini que lorsque Cond est vrai.

Dévoilement de l'utilisation

Considérez la déclaration suivante :

<code class="cpp">template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</code>
Copier après la connexion

Ici, le type de retour de foo est défini par std::enable_if::is_integer, void>::type. Puisque std::numeric_limits::is_integer est une condition booléenne, ce type de retour ne sera défini que si la condition est vraie.

Clarification du deuxième argument

Dans la notation :

<code class="cpp">template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }</code>
Copier après la connexion

Le = 0 est utilisé par défaut pour le deuxième paramètre du modèle. Cela permet aux deux options d'être invoquées à l'aide de foo(1), au lieu d'exiger deux paramètres de modèle si le paramètre std::enable_if n'était pas défini par défaut.

Détails remarquables

  • Taper explicitement le nom de type std::enable_if::type améliore la clarté.
  • En C 14, activate_if_t est un type établi qui doit être utilisé pour le type de retour, en le simplifiant en std::enable_if_t.
  • Pour les versions de Visual Studio antérieures à 2013, seul le type de retour peut utiliser activate_if.

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