Можно ли использовать мета-функцию type to value в качестве псевдонима переменной в C++14?

Рассматривая предложения псевдонимов мета-функций в C++14 ( TransformationTraits Redux, v2, N3655), я заметил, что не только преобразования типа в тип (например, add_const), введите значение мета-функции (например, is_void) также являются псевдонимами типа. (Которых нет в N3797).

Есть ли преимущество псевдонимов типа для оценки мета-функций? Я думаю, что можно использовать их без таких псевдонимов, таких как enable_if_t<is_void<T>::value,T> или же enable_if_t<is_void<T>{}(),T> когда операция преобразования присутствует. (Похоже is_void<T>::type::value такой же как is_void<T>::value)

Если мета-функции типа "значение-значение" должны быть псевдонимами, не лучше ли использовать их в качестве псевдонима шаблона переменных (у меня нет компилятора C++14 и никогда не использовался шаблон переменных. Таким образом, синтаксис может быть неправильным)? например, псевдоним is_void как

template <class T>
constexpr bool is_void_t = is_void<T>::value;

Вместо

template <class T>
using is_void_t = typename is_void<T>::type;

Тогда можно написать enable_if_t<is_void_t<T>,T> без стиля буста enable_ifи составление выражения будет проще (например, enable_if_t<(is_void_t<T> || is_integral_t<T>),T>

1 ответ

Решение

"Есть ли преимущество псевдонимов типа для оценки мета-функций?"

Цитирование из связанного N3655, перед спецификациями is_void_t и братья и сестры (стр. 4):

4 Дополнительные предлагаемые формулировки

Следующая формулировка предоставлена ​​в ответ на запрос LWG, в котором ::type члены должны быть последовательно предоставлены для всех типов черт, а не только для тех, которые классифицируются как TransformationTraits. Соответственно, в этом разделе приведены технические характеристики, необходимые для завершения набора.

Это объясняет, почему "тип для оценки мета-функций (таких как is_void ) также являются псевдонимами типа " в предложении: для согласованности.

Более того, было бы неправильно использовать имя " is_void_t Псевдоним is_void<T>::value, " _t Суффикс всегда обозначает тип. Для значения, возможно, можно использовать " _vСуффикс Таким образом, мы бы тогда имели оба:

template <class T>
using is_void_t = typename is_void<T>::type;

template <class T>
constexpr bool is_void_v = is_void<T>::value;

Это должно скомпилироваться в C++14, и тогда вы могли бы написать такие вещи, как enable_if_t<(is_void_v<T> || is_integral_v<T>),T>, Но я чувствую, что псевдоним значения "менее необходим", чем тип: он не экономит столько времени при наборе текста, и, как вы сказали, вы можете использовать короткий is_void<T>{}() с тем же эффектом (и для C++11, is_void<T>{} достаточно часто, благодаря его operator bool()).

Другие вопросы по тегам