Аналогичный вопрос: Почему
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
.