C++
typedefと型のエイリアス
サーチ…
前書き
typedef
および(C ++ 11以降) using
キーワードは既存の型に新しい名前を与えるために使用することができます。
構文
- typedef タイプ指定子seq init-declarator-list ;
- 属性指定子seq typedef 宣言子 指定子seq init宣言子リスト ; // C ++ 11以降
- identifier -specifier-seq ( opt )= type-idを使用します。 // C ++ 11以降
基本的なtypedefの構文
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
宣言は、通常の変数宣言と同じ構文を持ち、より複雑な宣言を読み書きすることができるという規則があり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
が存在しない場合にその名前が持つ型を参照し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
非常に簡単です:定義する名前が左側に行き、定義が右側に行きます。名前がどこにあるかを見るためにスキャンする必要はありません。
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
をusing
て型エイリアスを作成するのとまったく同じです。これは、同じことを達成するための単なる代替構文です。
typedef
とは異なり、 using
をテンプレートにusing
ことができます。 using
で作成された "template typedef"はエイリアステンプレートと呼ばれます。