C++
Typedef i aliasy typu
Szukaj…
Wprowadzenie
typedef
i (od C ++ 11) using
słów kluczowych, mogą być wykorzystane do nadania nowej nazwy do istniejącego typu.
Składnia
- typedef type-specifier-seq init-declarator-list ;
- atrybut-specifier-seq typedef decl-specifier-seq init-declarator-list ; // od C ++ 11
- przy użyciu identyfikatora atrybut-specyfikator-seq ( opt ) = typ-id ; // od C ++ 11
Podstawowa składnia typedef
Deklaracja typedef
ma taką samą składnię jak deklaracja zmiennej lub funkcji, ale zawiera słowo typedef
. Obecność typedef
powoduje, że deklaracja deklaruje typ zamiast zmiennej lub funkcji.
int T; // T has type int
typedef int T; // T is an alias for int
int A[100]; // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"
Po zdefiniowaniu aliasu typu można go używać zamiennie z oryginalną nazwą typu.
typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
A data;
};
typedef
nigdy nie tworzy odrębnego typu. Daje to tylko inny sposób odwoływania się do istniejącego typu.
struct S {
int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }
Bardziej złożone zastosowania typedef
Reguła, że deklaracje typedef
mają tę samą składnię, co zwykłe deklaracje zmiennych i funkcji, mogą być używane do odczytu i zapisu bardziej złożonych deklaracji.
void (*f)(int); // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"
Jest to szczególnie przydatne w konstrukcjach o mylącej składni, takich jak wskaźniki do elementów niestatycznych.
void (Foo::*pmf)(int); // pmf has type "pointer to member function of Foo taking int
// and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
// taking int and returning void"
Trudno zapamiętać składnię następujących deklaracji funkcji, nawet dla doświadczonych programistów:
void (Foo::*Foo::f(const char*))(int);
int (&g())[100];
typedef
może być użyty, aby ułatwić czytanie i pisanie:
typedef void (Foo::pmf)(int); // pmf is a pointer to member function type
pmf Foo::f(const char*); // f is a member function of Foo
typedef int (&ra)[100]; // ra means "reference to array of 100 ints"
ra g(); // g returns reference to array of 100 ints
Deklarowanie wielu typów za pomocą typedef
typedef
kluczowe typedef
jest specyfikatorem, więc ma zastosowanie osobno do każdego deklaratora. Dlatego każda deklarowana nazwa odnosi się do typu, jaki miałaby ta nazwa bez typedef
.
int *x, (*p)(); // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()
Deklaracja aliasu z „za pomocą”
Składnia using
jest bardzo prosta: nazwa, która ma zostać zdefiniowana, znajduje się po lewej stronie, a definicja po prawej stronie. Nie musisz skanować, aby zobaczyć, gdzie jest nazwa.
using I = int;
using A = int[100]; // array of 100 ints
using FP = void(*)(int); // pointer to function of int returning void
using MP = void (Foo::*)(int); // pointer to member function of Foo of int returning void
Tworzenie aliasu typu za using
przy using
ma dokładnie taki sam efekt, jak tworzenie aliasu typu za pomocą typedef
. Jest to po prostu alternatywna składnia do osiągnięcia tego samego.
W przeciwieństwie do typedef
, using
może być szablonowe. „Szablon typedef” utworzony przy using
nazywany jest szablonem aliasu .