Maison > développement back-end > C++ > Pourquoi y a-t-il une affectation apparemment dénuée de sens à std::enable_if dans les modèles C ?

Pourquoi y a-t-il une affectation apparemment dénuée de sens à std::enable_if dans les modèles C ?

Linda Hamilton
Libérer: 2024-11-06 10:49:02
original
756 Les gens l'ont consulté

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

Comprendre le fonctionnement interne de std::enable_if

Dans une question récente, l'utilisation de std::enable_if comme type de retour conditionnel a été discutée. Alors que le premier usage était clair, le second, qui incluait une assignation apparemment dénuée de sens à std::enable_if, restait déroutant.

Déverrouiller le concept

Pour percer le mystère , nous devons nous plonger dans la définition de std::enable_if:

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

La clé réside dans le fait que le type typedef T n'est défini que lorsque bool Cond est vrai.

Application à l'exemple

Avec cette compréhension en main, revisitons le code :

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

Ici, std::enable_if est utilisé pour définir le type de retour de la fonction foo . Si T est un entier, le type de retour sera nul ; sinon, la fonction ne compilera pas.

Le rôle de la valeur par défaut

Dans le deuxième exemple :

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

Le paramètre par défaut = 0 garantit que les deux options peuvent être appelées avec foo(1);. Sans défaut, appeler foo nécessiterait deux paramètres de modèle au lieu de simplement int.

Évolution de la compréhension

En C 14, le type std::enable_if_t est introduit, qui doit être utilisé à la place du formulaire typedef. Cela se traduit par un type de retour plus concis :

std::enable_if_t<std::numeric_limits<T>::is_integer>
Copier après la connexion

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