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
Barbara Streisandoriginal
2024-11-05 07:52:02749parcourir

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>

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>

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>

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