Je voudrais prendre une page de boost::hana
et de rendre la valeur de retour de l' is_lvalue
encoder la lvalue-ness de sa thèse, à la fois en tant que constexpr
de la valeur, et comme un type.
Cela vous permet de faire des trucs comme balise de dispatching, sans supplément de passe-partout.
template<class T>
constexpr std::is_lvalue_reference<T&&>
is_lvalue(T&&){return {};}
le corps de cette fonction ne fait rien, et la valeur du paramètre est ignoré. Cela lui permet d'être constexpr même sur la non-constexpr valeurs.
Un avantage de cette technique peut être vu ici:
void tag_dispatch( std::true_type ) {
std::cout << "true_type!\n";
}
void tag_dispatch( std::false_type ) {
std::cout << "not true, not true, shame on you\n";
}
tag_dispatch( is_lvalue( 3 ) );
Non seulement la valeur de retour de l' is_lvalue
disponible en constexpr
contexte true_type
et false_type
ont un constexpr operator bool
), mais on peut facilement choisir une surcharge basée sur son état.
Un autre avantage est que cela rend difficile pour le compilateur de ne pas insérer le résultat. Avec un constexpr
de la valeur, le compilateur peut "facilement" d'oublier que c'est une véritable constante; avec un type, il faut d'abord converti en bool
pour la possibilité d'être oublié de se produire.