サーチ…


前書き

typedefおよび(C ++ 11以降) using キーワードは既存の型に新しい名前を与えるために使用することができます。

構文

  • typedef タイプ指定子seq init-declarator-list ;
  • 属性指定子seq typedef 宣言子 指定子seq init宣言子リスト ; // C ++ 11以降
  • identifier -specifier-seqopt )= type-idを使用します。 // C ++ 11以降

基本的なtypedefの構文

typedef宣言は、変数宣言または関数宣言と同じ構文を持ちますが、 typedefという単語が含まれていtypedeftypedefの存在により、宣言は変数または関数の代わりに型を宣言します。

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"によるエイリアス宣言

C ++ 11

構文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て型エイリアスを作成するのは、 typedefusingて型エイリアスを作成するのとまったく同じです。これは、同じことを達成するための単なる代替構文です。

typedefとは異なり、 usingをテンプレートにusingことができます。 usingで作成された "template typedef"はエイリアステンプレートと呼ばれます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow