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; };
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); }
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(); }
Le paramètre par défaut = 0 garantit que les deux options peuvent être appelées avec foo
É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>
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!