Можно ли использовать мета-функцию 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()
).