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

5

Решение

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

Цитирование из связанного 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()).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]