1

std::enable_if_t получает тип, если определенное значение истинно. Теперь мне нужна вещь, которая дает вам тип, если выражение хорошо сформировано. Если мне нужен тип void, я могу сделать decltype((void)(expr)). Но что мне делать, если я хочу чего-то другого, кроме void? Я хочу сжатое и элегантное решение.Обратный путь к std :: enable_if_t

+2

Вы пытаетесь реализовать что-то вроде [ 'зЬй :: экспериментальный :: is_detected'] (http://en.cppreference.com/w/cpp/experimental/ is_detected)? Возможно, вам нужно что-то вроде ['std :: void_t'] (http://en.cppreference.com/w/cpp/types/void_t). – TartanLlama

+0

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

ответ

2

Вы можете использовать что-то вроде этого:

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

А затем объединить, что с enable_if_t

+0

Если 'T' не является корректным, то все выражение не скомпилируется, а не возвращает' false_type'. Таким образом, это не так хорошо ... Вы можете также выполнить 'std :: conditional_t ​​' – Yakk

+0

@Yakk 'std :: enable_if_t :: value, result_type>' is довольно ясно, хотя, я думаю. Мне нравится и ваша версия, тем более, что вам не нужна другая вспомогательная структура, но я считаю, что читать ее немного сложнее. – Rumburak

2

Неясно, как именно вы хотите использовать это, но вы могли бы обобщать 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)> 

 Смежные вопросы

  • Нет связанных вопросов^_^