2010-11-11 70 views
18

據我瞭解,在C++ 0x中模板的別名將使我們能夠做到以下幾點:靈活的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? 

或者都不是?

回答

16

的語法是:

template <typename Iter> 
using ValueType = typename std::iterator_traits<Iter>::value_type; 

與你的第二個。

來源: http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias

他們的例子是:當一個部件類型遵循::操作者模板id它前面

template<int N> 
    using int_exact = typename int_exact_traits<N>::type; // define alias for convenient notation 
3

typename是必需的,。

您提到的typename的用法不是特定於模板別名,也不是必需的,除非您將某個成員設爲別名,例如::type,但這是一種常見用例。

例如,在向現有模板引入簡單別名時沒有typename

template< typename x > 
class bar; 

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