При рассмотрении 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>
«Есть ли какое-либо преимущество псевдонима типа для оценки мета-функций?»
Цитирование из связанного 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()
).
Других решений пока нет …