Jakie są różnice między używaniemJakie są różnice między typedef a używaniem?
typedef Some::Nested::Namespace::TypeName TypeName;
lub
using Some::Nested::Namespace::TypeName;
dostarczyć skrót TypeName
w zakresie lokalnym?
Jakie są różnice między używaniemJakie są różnice między typedef a używaniem?
typedef Some::Nested::Namespace::TypeName TypeName;
lub
using Some::Nested::Namespace::TypeName;
dostarczyć skrót TypeName
w zakresie lokalnym?
typedef
podaje nazwę aliasu dla typu.
typedef Some :: Nested :: Namespace :: TypeName TypeName;
Gdy to zrobisz, możesz odwołać Some::Nested::Namespace::TypeName
prostu mówiąc TypeName
w lokalnej przestrzeni nazw.
using declaration
powoduje, że typ jest widoczny w bieżącym obszarze nazw.
za pomocą Some :: Nested :: Namespace :: TypeName;
Importuje typ do bieżącego obszaru nazw.
W tym przypadku za pomocą jednego z powyższych można polecić Some::Nested::Namespace::TypeName
, używając tylko TypeName
w lokalnej przestrzeni nazw.
Użycie just przynosi deklarację do lokalnego zakresu, natomiast typedef wprowadza typedef-name. Jedyną różnicą między nimi jest drobiazgowe Specyfikatory typu, np .:
namespace n
{
class foo
{
};
}
typedef n::foo n_foo;
using n::foo;
int main()
{
class foo f1; // ok, declares f1 variable of type n::foo.
class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier.
}
mają różne pochodzenie i różne zastosowania.
typedef
pochodzi z C
: Przypomnijmy, że droga C do deklarowania struct jest:
typedef struct _MyStruct { .... } MyStruct;
To pozwala na wprowadzenie alias dla typu tylko. Może być stosowany do rodzaju funkcji, z nietypowej składni ...
typedef void (*Func)(Foo, Bar);
Func
Gdzie jest teraz wskaźnik do funkcji biorąc dwa argumenty za kopię (typów Foo
i Bar
odpowiednio) i powrocie nic .
using
ma pierwotnie inne znaczenie. Ma to na celu wstrzyknięcie nazwy do zakresu. Można podać dowolną nazwę (prawie): typy, funkcje, zmienne (ale nie wartości wyliczeniowe ...)
z C++ 11, składnia została ulepszona w celu umożliwienia szablonu aliasing:
template <typename T>
using equiv_map = std::map<T,T>;
Ten zasilany-up using
oznacza, że aliasing (patrz poniżej) jest obecnie możliwe, na wierzchu poprzednich funkcjonalności .
Ta zmiana w C++ 11 jest wyraźnym kierunkiem w kierunku harmonizacji składni. Zauważ, jak definicja aliasu jest podobna do definicji zmiennej:
<name> = <expression>;
Niestety wydaje się, że standardowa zastrzeżone ten aliasing do sytuacji szablonów, więc na razie zarówno
typedef
i
using
współistnieją, każdy z własnym obszar polowań.
Czy masz na myśli ostatni akapit, że 'using name = int;' nie jest dobrze sformułowany w C++ 11? – dyp
@DyP: To właśnie miałem na myśli, choć nie mogę sobie przypomnieć, dlaczego tak się dzieje (i jest bardzo przydatny dla referencji/wskaźników funkcji). Zastanawiam się, czy zostałem spalony przez wczesną wersję gcc/clang. –
Czy jest jednak duża różnica? W szczególności w świetle ulepszonej instrukcji C++ 11 'using', która pozwala na definiowanie szablonowych aliasów. –
Jest co najmniej jedna różnica dla typów szablonów. Możesz tylko 'typedef' wyspecjalizowany typ, taki jak' vector 'i możesz użyć' using' na szablonie niespecyfizowanym (na przykład 'vector') –
jalf
Jeśli masz grupę przeciążonych operatorów, które chcesz import, 'typedef' nie działa w tym przypadku, ponieważ musisz używać' using'! – AraK