C ++ 0x中模板别名的灵活性是怎么样的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

据我所知,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?

或者既不?

提问于
用户回答回答于

语法是:

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
用户回答回答于

typename当成员类型跟随::运算符并且模板ID在其之前时是必需的。

typename提到的用法并非特定于模板别名,除非将某个成员设为别名::type,但这是一种常见用例。

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

template< typename x >
class bar;

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

扫码关注云+社区