2010-11-11 49 views
18

Theo tôi được biết, mẫu bí danh trong C++ 0x sẽ cho phép chúng ta làm như sau:Tính linh hoạt của mẫu bí danh trong C++ 0x

template <typename T> 
using Dictionary = std::map< std::string, T >; 

Dictionary<int> ints; 
ints[ "one" ] = 1; 
ints[ "two" ] = 2; 

Tôi có hai câu hỏi:

Thứ nhất, sẽ chúng ta có thể làm được điều này (ràng buộc với bất kỳ loại, hoặc chỉ các mẫu):

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

thứ hai, sẽ sử dụng các bí danh đòi hỏi sử dụng các từ khóa typename trong các mẫu, ví dụ:

012.
template <typename Iter> 
typename ValueType<Iter> sum(Iter first, Iter last) { ... } 
//^required? 

Hoặc là yêu cầu trong khai báo bí danh?

using ValueType = typename std::iterator_traits<Iter>::value_type; 
//     ^required? 

Hay không?

Trả lời

16

Cú pháp là:

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

như với một thứ hai của bạn.

Nguồn: http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias

dụ của họ là:

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

typename được yêu cầu khi một loại thành viên sau các nhà điều hành :: và một mẫu-id trước nó.

Việc sử dụng typename bạn đề cập không cụ thể đối với bí danh mẫu cũng như yêu cầu trừ khi bạn đang đặt bí danh cho thành viên chẳng hạn như ::type, nhưng đó là trường hợp sử dụng phổ biến.

Ví dụ: không có typename khi giới thiệu tên bí danh đơn giản cho mẫu hiện có.

template< typename x > 
class bar; 

template< typename x > 
using foo = bar<x>; // no typename needed 
Các vấn đề liên quan