type - using for template c++
Qual è la differenza tra "typedef" e "using" in C++ 11? (3)
So che in C ++ 11 possiamo ora usare using
per scrivere alias di tipo, come typedef
s:
typedef int MyInt;
È, da quello che capisco, equivalente a:
using MyInt = int;
E questa nuova sintassi è emersa dallo sforzo di avere un modo per esprimere " template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Ma, con i primi due esempi non modello, ci sono altre sottili differenze nello standard? Ad esempio, typedef
s fa aliasing in un modo "debole". Cioè non crea un nuovo tipo ma solo un nuovo nome (le conversioni sono implicite tra quei nomi).
È lo stesso con l' using
o genera un nuovo tipo? Ci sono delle differenze?
L' uso della sintassi ha un vantaggio quando viene utilizzato all'interno dei modelli. Se è necessaria l'astrazione del tipo, ma è anche necessario mantenere in futuro il parametro del modello da specificare. Dovresti scrivere qualcosa come questo.
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; }
Ma l' uso della sintassi semplifica questo caso d'uso.
template <typename T> using my_type = whatever<T>;
my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }
Sono equivalenti, dallo standard (sottolineatura mia) (7.1.3.2):
Un nome typedef può anche essere introdotto da una dichiarazione alias. L'identificatore che segue la parola chiave using diventa un typedef-name e l'attributo-specificatore-seq opzionale che segue l'identificatore appartiene a quel typedef-name. Ha la stessa semantica come se fosse stata introdotta dallo specificatore typedef. In particolare, non definisce un nuovo tipo e non deve apparire nel tipo-id.
Sono in gran parte gli stessi, tranne che:
La dichiarazione alias è compatibile con i modelli, mentre lo stile C typedef non lo è.