1

std::enable_if_t obtient un type si une certaine valeur est vraie. Maintenant, je veux une chose qui vous donne un type si une expression est bien formée. Si le type que je veux est void, je peux faire decltype((void)(expr)). Mais que dois-je faire si je veux autre chose que void? Je veux une solution succincte et élégante.Counterpart à std :: enable_if_t

+2

Essayez-vous de mettre en œuvre quelque chose comme [ 'std :: :: expérimental is_detected'] (http://en.cppreference.com/w/cpp/experimental/ est détecté)? Peut-être que vous voulez quelque chose comme ['std :: void_t'] (http://en.cppreference.com/w/cpp/types/void_t). – TartanLlama

+0

'decltype ((void) (expr), std :: declval ())' – cpplearner

Répondre

2

Vous pouvez utiliser quelque chose comme ceci:

template<typename T> 
struct well_formed : std::true_type{}; 

Et puis combiner avec enable_if_t

+0

Si 'T' n'est pas bien formé, l'expression entière ne peut pas être compilée au lieu de retourner' false_type'. Donc ce n'est pas bien nommé ... Vous pourriez aussi bien faire 'std :: conditional_t ​​' – Yakk

+0

@Yakk 'std :: enable_if_t :: value, result_type>' est assez clair, cependant, je pense. J'aime aussi ta version, d'autant plus que tu n'as pas besoin d'une autre structure d'aide, mais je crois que c'est un peu plus difficile à lire. – Rumburak

2

On ne sait pas exactement comment vous voulez utiliser, mais vous pouvez généraliser std::void_t:

template<typename T, typename...> struct helper { using type = T; }; 
template<typename T, typename...Ts> 
using type_t = typename helper<T,Ts...>::type; 

(L'aide peut être nécessaire en raison de this standards defect)

ensuite l'utiliser comme ceci:

type_t<int, decltype(expr)>