Подобный вопрос: Почему
type_traits
реализован со специализированными структурами шаблонов вместо constexpr? - но с другим ответом.
Я понимаю, что шаблоны псевдонимов не могут быть специализированными и, следовательно, can not в настоящее время используются для реализации типов типов непосредственно 1. Однако это сознательное решение комитета, и, насколько я вижу, нет никаких технических оснований, чтобы запретить это.
Итак, не имело ли смысла использовать черты типа в качестве шаблонов псевдонимов, оптимизируя их синтаксис?
Рассмотрим
typename enable_if<is_pointer<T>::value, size_t>::type
address(T p);
против
enable_if<is_pointer<T>, size_t> address(T p);
Конечно, это вводит изменение интерфейса при переходе из Boost.TypeTraits - но это действительно такая большая проблема?
В конце концов, код должен быть изменен в любом случае, поскольку типы находятся в разных пространствах имен и, как многие современные программисты на C++ неохотно открывают пространства имен, будут явно определены (если они вообще будут изменены).
С другой стороны, это значительно упрощает код. И учитывая, что метапрограммирование шаблона часто глубоко вложено, запутанно и сложно, кажется очевидным, что более понятный интерфейс выгоден.
Я что-то упустил? Если нет, Id оценивает ответ, который не является догадкой, но полагается (и может ссылаться) на знание обоснования решений комитетов.
1 Но очень хорошо косвенно! Рассмотрим:
template <typename T> using is_pointer = typename meta::is_pointer<T>::type;
Где meta::is_pointer<T>
соответствует текущему типу std::is_pointer<T>
.