Это своего рода странный вопрос, хотя это довольно очевидно:Почему все классы type_traits должны вызываться с использованием 'typename' и ':: type' Prefix/Suffix?
Почему все шаблоны <type_traits>
должны быть вызваны с typenname
и ::type
префикс/суффикс?
Одной из причин были бы, конечно, что не было никакого шаблонного ЬурейеЙ как 0x using
C++ штуковина, что позволяет:
template<typename T>
using remove_ref = typename std::remove_reference<T>::type;
remove_ref<int&> foo = 4;
Так что этот вопрос меньше о, почему она в настоящее время является в этом случае, но больше о будет ли это поведение упрощено в будущих стандартах на С ++?.
Аналогичное улучшение может иметь такие черты, как std::is_pointer<T>::value
. Я уже вижу шаблонные константы на горизонте C++ 14/17, которые позволят использовать такие как std::is_pointer<T>
.
Примечание: Насколько мне известно, это упрощение не распространяется ни на один из опубликованных материалов, касающихся предстоящих стандартов C++. В этом случае нет реального ответа «да/нет» на этот вопрос, и этот поток может выступать в качестве списка pro/con, может ли это быть изменено в любых новых версиях C++.
EDIT:
Благодаря @Drew_Dormann и @erenon, которые правильно указали, что там уже были _t
версии добавлены ко всем шаблонам типа признака, что именно сделать это.
Тем не менее, он по-прежнему открыт, есть ли какие-либо признаки того, что значения, такие как std::is_pointer
, станут частью аналогичного упрощения, кроме std::is_pointer<T>()
-Version?
Странно, как я к этому не пришел ?! Ну, тогда на это нужно ответить, если это изменение будет также применено к :: value templates –
@hdv Спасибо за версию parenthese. Я также уточнил этот вопрос, чтобы быть более конкретным. –
@JakobRiedle Я ошибался, переменные шаблоны являются частью C++ 14. Я должен был забыть. Тем не менее, нет 'std :: is_pointer_v'. Однако это не сэкономило бы при наборе поверх 'std :: is_pointer ()'. –
hvd