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
Répondre
Vous pouvez utiliser quelque chose comme ceci:
template<typename T>
struct well_formed : std::true_type{};
Et puis combiner avec enable_if_t
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 'std :: enable_if_t
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)>
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
'decltype ((void) (expr), std :: declval())' –
cpplearner