Гибкость псевдонима шаблона в C ++ 0x - PullRequest
18 голосов
/ 11 ноября 2010

Как я понимаю, псевдонимы шаблонов в C ++ 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?

Или ни того, ни другого?

Ответы [ 2 ]

16 голосов
/ 11 ноября 2010

Синтаксис:

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
3 голосов
/ 08 ноября 2012

typename требуется, когда тип элемента следует за оператором ::, а идентификатор шаблона предшествует ему.

Использование typename, которое вы упоминаете, не относится ни к псевдонимам шаблона, ни к нему.требуется, если вы не используете псевдоним для члена, такого как ::type, но это распространенный вариант использования.

Например, typename при вводе простого имени псевдонима в существующий шаблон не существует.

template< typename x >
class bar;

template< typename x >
using foo = bar< x >; // no typename needed
...