que - template typename t c++
Flexibilidad del alias de la plantilla en C++ 0x (2)
Según tengo entendido, los alias de plantillas en C ++ 0x nos permitirán hacer lo siguiente:
template <typename T>
using Dictionary = std::map< std::string, T >;
Dictionary<int> ints;
ints[ "one" ] = 1;
ints[ "two" ] = 2;
Tengo dos preguntas:
Primero, podremos hacer esto (enlazar con cualquier tipo, o solo con plantillas):
template <typename Iter>
using ValueType = std::iterator_traits<Iter>::value_type;
En segundo lugar, el uso de los alias requerirá 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 se requiere en la declaración de alias?
using ValueType = typename std::iterator_traits<Iter>::value_type;
// ^ required?
¿O tampoco?
La sintaxis es:
template <typename Iter>
using ValueType = typename std::iterator_traits<Iter>::value_type;
como con tu 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
typename
es obligatorio cuando un tipo de miembro sigue al operador ::
y una plantilla-id lo precede.
El uso del typename
de typename
de typename
que menciona no es específico de los alias de plantilla ni es obligatorio a menos que esté creando un alias para un miembro como ::type
, pero ese es un caso de uso común.
Por ejemplo, no hay un typename
al introducir un nombre de alias simple a una plantilla existente.
template< typename x >
class bar;
template< typename x >
using foo = bar< x >; // no typename needed