2010-11-11 11 views
18

Según entiendo, los alias de plantillas de C++ 0x nos permitirá hacer lo siguiente:Flexibilidad de alias de plantillas de C++ 0x

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

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

Tengo dos preguntas:

primer lugar, se seamos capaces de hacer esto (se unen a cualquier tipo, o simplemente las plantillas):

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

en segundo lugar, se utiliza los alias requieren el uso de la palabra clave typename en las plantillas, por ejemplo:

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

¿O es necesario en la declaración de alias?

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

¿O ninguno?

Respuesta

16

La sintaxis es la siguiente:

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

como con su segundo.

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

Su ejemplo es:

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

typename se requiere cuando un tipo de miembro sigue el operador :: y una plantilla-id precede.

El uso de typename que menciona no es específico de los alias de la plantilla ni es necesario a menos que esté creando alias a un miembro como ::type, pero ese es un caso de uso común.

Por ejemplo, no hay typename cuando se introduce un nombre de alias simple en una plantilla existente.

template< typename x > 
class bar; 

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