Scott Meyers a publié le contenu et le statut de son prochain livre EC ++ 11. Il a écrit qu'un élément du livre pourrait être "Eviter std::enable_if
les signatures de fonction" .
std::enable_if
peut être utilisé comme argument de fonction, comme type de retour ou comme modèle de classe ou paramètre de modèle de fonction pour supprimer conditionnellement des fonctions ou des classes de la résolution de surcharge.
Dans cette question, les trois solutions sont présentées.
En tant que paramètre de fonction:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
En tant que paramètre de modèle:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Comme type de retour:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Quelle solution privilégier et pourquoi éviter les autres?
- Dans quels cas "Eviter
std::enable_if
dans les signatures de fonction" concerne l'utilisation comme type de retour (qui ne fait pas partie de la signature de fonction normale mais des spécialisations de modèle)? - Existe-t-il des différences entre les modèles de fonctions membres et non membres?
std::enable_if
encombrer mes signatures de fonction (en particulier la version laide de l' nullptr
argument de fonction supplémentaire ) parce que cela ressemble toujours à ce que c'est, un étrange hack (pour quelque chose qui static if
pourrait faire beaucoup plus beau et propre) en utilisant un modèle de magie noire pour exploiter une fonctionnalité de langage intéressante. C'est pourquoi je préfère l'envoi de balises chaque fois que possible (enfin, vous avez encore des arguments étranges supplémentaires, mais pas dans l'interface publique et aussi beaucoup moins moche et cryptique ).
=0
dans typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
accomplir? Je n'ai pas trouvé de ressources correctes pour le comprendre. Je sais que la première partie avant =0
a un type de membre int
si U
et int
est le même. Merci beaucoup!