C++
Типед и псевдонимы типов
Поиск…
Вступление
Параметры typedef
и (начиная с C ++ 11) using
ключевых слов могут использоваться для обозначения нового имени существующего типа.
Синтаксис
- typedef type-specifier-seq init-declarator-list ;
- attribute-specifier-seq typedef decl-specifier-seq init-declarator-list ; // с C ++ 11
- используя идентификатор attribute-specifier-seq ( opt ) = type-id ; // с C ++ 11
Основной синтаксис typedef
Объявление typedef
имеет тот же синтаксис, что и объявление переменной или функции, но содержит слово typedef
. Присутствие typedef
заставляет объявление объявлять тип вместо переменной или функции.
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"
Как только псевдоним типа определен, его можно использовать взаимозаменяемо с исходным именем типа.
typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
A data;
};
typedef
никогда не создает отдельный тип. Это дает только другой способ ссылаться на существующий тип.
struct S {
int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }
Более сложное использование typedef
Правило о том, что объявления typedef
имеют тот же синтаксис, что и обычные объявления переменных и функций, могут использоваться для чтения и записи более сложных объявлений.
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"
Это особенно полезно для конструкций с запутанным синтаксисом, таких как указатели на нестатические элементы.
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"
Трудно вспомнить синтаксис следующих объявлений функций, даже для опытных программистов:
void (Foo::*Foo::f(const char*))(int);
int (&g())[100];
typedef
может использоваться для упрощения чтения и записи:
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
Объявление нескольких типов с помощью typedef
Ключевое слово typedef
является спецификатором, поэтому оно применяется отдельно для каждого декларатора. Следовательно, каждое объявленное имя относится к типу, которое это имя имело бы при отсутствии 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(*)()
Объявление псевдонима с "использованием"
Синтаксис using
очень прост: имя, которое должно быть определено, идет с левой стороны, а определение - с правой стороны. Не нужно сканировать, чтобы узнать, где это имя.
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
Создание псевдонима типа с using
имеет тот же эффект, что и создание псевдонима типа с typedef
. Это просто альтернативный синтаксис для достижения того же.
В отличие от typedef
, using
может быть шаблоном. «Шаблон typedef», созданный с using
, называется шаблоном псевдонимов .