2015-02-24 6 views
0

Это своего рода странный вопрос, хотя это довольно очевидно:Почему все классы 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?

ответ

3

Тем не менее, остается открытым, есть ли какие-либо признаки того, что ценят черты, как std::is_pointer будет частью аналогичного упрощения кроме std::is_pointer<T>() -версия?

Да. Первый library fundamentals TS, в настоящее время в бюллетене DTS, добавляет множество шаблонов _v. Например:

template <class T> constexpr bool is_pointer_v 
    = is_pointer<T>::value; 

Как и все добавляют в TS, это в std::experimental пространстве имен. Они были реализованы в версии trunk libstdC++ и libC++.

5

В C++ 14 есть remove_reference_t, что является именно тем, что вы ищете.

+0

Странно, как я к этому не пришел ?! Ну, тогда на это нужно ответить, если это изменение будет также применено к :: value templates –

+0

@hdv Спасибо за версию parenthese. Я также уточнил этот вопрос, чтобы быть более конкретным. –

+0

@JakobRiedle Я ошибался, переменные шаблоны являются частью C++ 14. Я должен был забыть. Тем не менее, нет 'std :: is_pointer_v '. Однако это не сэкономило бы при наборе поверх 'std :: is_pointer ()'. – hvd