Почему свойства типа C++11 не являются псевдонимами шаблонов?

Аналогичный вопрос: Почему type_traitsреализованы со специализированными структурами шаблонов вместо constexpr?– но с другим ответом.

Я понимаю, что шаблоны псевдонимов не могут быть специализированыи, следовательно, в настоящее время не могут использоваться для прямой реализации типажей 1. Однако это сознательное решение комитета, и, насколько я вижу, технических причин запрещать это нет.

Так не лучше ли было бы реализовать признаки типов в качестве шаблонов псевдонимов, упростив их синтаксис?

Сравните

 typename enable_if::value, size_t>::type
 address(T p);

и

 enable_if, size_t> address(T p);

. Конечно, это приводит к серьезному изменению интерфейса при переходе с Boost.TypeTraits. Но действительно ли это такая большая проблема?

В конце концов, код в любом случае нужно будет модифицировать, так как типы находятся в разных пространствах имен и, поскольку многие современные программисты на C++ неохотно открывают пространства имен, будут квалифицироваться явно (если они вообще будут изменены).

С другой стороны, это значительно упрощает код. А учитывая, что метапрограммирование шаблонов часто становится глубоко вложенным, запутанным и сложным, кажется очевидным, что более понятный интерфейс выгоден.

Я что-то упустил? Если нет, я был бы признателен за ответ, который не является простым предположением, а опирается (и может цитировать) на знание обоснования решения комитета.


1Но очень хорошо косвенно! Рассмотрим:

template  using is_pointer = typename meta::is_pointer::type;

Где meta::is_pointerсоответствует текущему типу std::is_pointer.

23
задан Community 23 May 2017 в 11:45
поделиться