std::enable_if_t
получает тип, если определенное значение истинно. Теперь мне нужна вещь, которая дает вам тип, если выражение хорошо сформировано. Если мне нужен тип void
, я могу сделать decltype((void)(expr))
. Но что мне делать, если я хочу чего-то другого, кроме void
? Я хочу сжатое и элегантное решение.Обратный путь к std :: enable_if_t
ответ
Вы можете использовать что-то вроде этого:
template<typename T>
struct well_formed : std::true_type{};
А затем объединить, что с enable_if_t
Если 'T' не является корректным, то все выражение не скомпилируется, а не возвращает' false_type'. Таким образом, это не так хорошо ... Вы можете также выполнить 'std :: conditional_t
@Yakk 'std :: enable_if_t
Неясно, как именно вы хотите использовать это, но вы могли бы обобщать 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;
(Вспомогательный может понадобиться из-за this standards defect)
Затем использовать его следующим образом:
type_t<int, decltype(expr)>
Вы пытаетесь реализовать что-то вроде [ 'зЬй :: экспериментальный :: is_detected'] (http://en.cppreference.com/w/cpp/experimental/ is_detected)? Возможно, вам нужно что-то вроде ['std :: void_t'] (http://en.cppreference.com/w/cpp/types/void_t). – TartanLlama
'decltype ((void) (expr), std :: declval())' –
cpplearner