Гибкость псевдонима шаблона в С++ 0x
Как я понимаю, псевдонимы шаблонов в С++ 0x позволят нам сделать следующее:
template <typename T>
using Dictionary = std::map< std::string, T >;
Dictionary<int> ints;
ints[ "one" ] = 1;
ints[ "two" ] = 2;
У меня есть два вопроса:
Сначала мы сможем это сделать (привязать к любому типу или просто шаблонам):
template <typename Iter>
using ValueType = std::iterator_traits<Iter>::value_type;
Во-вторых, использование псевдонимов требует использования ключевого слова typename
в шаблонах, например:
template <typename Iter>
typename ValueType<Iter> sum(Iter first, Iter last) { ... }
// ^ required?
Или это требуется в объявлении псевдонима?
using ValueType = typename std::iterator_traits<Iter>::value_type;
// ^ required?
Или нет?
Ответы
Ответ 1
Синтаксис:
template <typename Iter>
using ValueType = typename std::iterator_traits<Iter>::value_type;
как и ваш второй.
Источник:
http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias
Их пример:
template<int N>
using int_exact = typename int_exact_traits<N>::type; // define alias for convenient notation
Ответ 2
typename
требуется, когда тип члена следует за оператором ::
, и предшествует ему идентификатор шаблона.
Использование typename
, которое вы упомянули, не относится к псевдонимам шаблонов и не требуется, если вы не навязываете члену, например ::type
, но это обычный прецедент.
Например, там нет typename
при введении простого псевдонима в существующий шаблон.
template< typename x >
class bar;
template< typename x >
using foo = bar< x >; // no typename needed