C ++ 0x中模板别名的灵活性

时间:2010-11-11 09:34:11

标签: c++ templates c++11 typename

据我所知,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 个答案:

答案 0 :(得分:16)

语法为:

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

答案 1 :(得分:3)

当成员类型跟在typename运算符后面并且模板ID位于其前面时,

::是必需的。

您提到的typename的使用并非特定于模板别名,也不是必需的,除非您对::type等成员别名,但这是一个常见的用例。

例如,在向现有模板引入简单别名时没有typename

template< typename x >
class bar;

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