Наиболее конкретный ответ на ваш вопрос: никто никогда не предлагал сделать это таким образом.
Комитет по стандартам C ++ - это многонациональная, многопрофильная группа добровольцев.Вы думаете об этом как проектный комитет в рамках одной организации.Комитет по стандартам C ++ буквально не может ничего сделать без предложения о включении слов в проект стандарта.
Я полагаю, что причина, по которой не было никакого предложения, заключается в том, что черты типа были ранним предложением, а реализация надстройки началась в далеком прошлом.примерно до 2000 года. И псевдонимы шаблонов были запоздалыми в реализации.Многие из членов комитета неохотно предлагают то, что они не осуществили.И у вас просто не было возможности реализовать ваше предложение.
Было много давления для выпуска C ++ 11.Он действительно был предназначен для отправки в 2009 году, и когда эта дата откатилась, было очень сложно что-либо сделать с рабочим документом, кроме исправления уже рассмотренных функций.В какой-то момент вы должны отложить на задний план замечательные новые идеи, чтобы вы никогда не отправили.
Обновление
Начиная с C ++ 14,TransformationTraits (те, которые приводят к типу) теперь имеют написание псевдонима шаблона, например:
template <bool b, class T = void>
using enable_if_t = typename enable_if<b,T>::type;
И рабочий проект C ++ 1z теперь имеет написание переменных шаблона для признаков, приводящих к значениям:
template <class T>
constexpr bool is_pointer_v = is_pointer<T>::value;
Кроме того, даже в C ++ 11 можно сделать:
typename enable_if<is_pointer<T>{}, size_t>::type
address(T p);
Т.е. вы можете использовать {}
вместо ::value
(при условии, что ваш компилятор поддерживает constexpr
),В C ++ 14 это становится:
enable_if_t<is_pointer<T>{}, size_t>
address(T p);
И в C ++ 1z:
enable_if_t<is_pointer_v<T>, size_t>
address(T p);
Обратите внимание, что разница между C ++ 1z и C ++ 14 настолько минимальначто он даже не сохраняет символы, просто меняет {}
на _v
и меняет расположение этих двух символов.