c++ - enum - typedef ppt
¿Cuál es la diferencia entre ''typedef'' y ''usar'' en C++ 11? (4)
La sintaxis de uso tiene una ventaja cuando se usa dentro de plantillas. Si necesita la abstracción de tipo, pero también necesita mantener el parámetro de la plantilla para poder especificarlo en el futuro. Deberías escribir algo como esto.
template <typename T> struct whatever {};
template <typename T> struct rebind
{
typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};
rebind<int>::type variable;
template <typename U> struct bar { typename rebind<U>::type _var_member; }
Pero el uso de la sintaxis simplifica este caso de uso.
template <typename T> using my_type = whatever<T>;
my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }
Sé que en C ++ 11 ahora podemos usar using
para escribir alias de tipo, como typedef
s:
typedef int MyInt;
Es, por lo que entiendo, equivalente a:
using MyInt = int;
Y esa nueva sintaxis surgió del esfuerzo por tener una forma de expresar " template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Pero, con los dos primeros ejemplos sin plantillas, ¿hay otras diferencias sutiles en el estándar? Por ejemplo, typedef
s hace aliasing de una manera "débil". Es decir, no crea un nuevo tipo, sino solo un nuevo nombre (las conversiones son implícitas entre esos nombres).
¿Es lo mismo con using
o genera un nuevo tipo? ¿Hay alguna diferencia?
Son en gran parte los mismos, excepto que:
La declaración de alias es compatible con las plantillas, mientras que el typedef de estilo C no lo es.
Son equivalentes, desde el estándar (énfasis mío) (7.1.3.2):
Un typedef-name también puede ser introducido por una declaración de alias. El identificador que sigue a la palabra clave using se convierte en typedef-name y el atributo opcional-especificador-seq que sigue al identificador pertenece a ese typedef-name. Tiene la misma semántica que si fuera introducida por el especificador typedef. En particular, no define un nuevo tipo y no aparecerá en el ID de tipo.
Son esencialmente los mismos, pero el using
proporciona alias templates
que son bastante útiles. Un buen ejemplo que pude encontrar es el siguiente:
namespace std {
template<typename T> using add_const_t = typename add_const<T>::type;
}
Por lo tanto, podemos utilizar std::add_const_t<T>
lugar de typename std::add_const<T>::type