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

source:php.cn
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