C++のリファレンスページでは、typedefの例がいくつか提供されており、それらの意味を理解しようとしています。
// simple typedef
typedef unsigned long mylong;
// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];
だから私が理解している単純なtypedef(最初の宣言)。
しかし、彼らは2番目のもの(以下で繰り返されます)で何を宣言していますか?
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
特に(&fp)(int, mylong)
はどういう意味ですか?
複数の変数を一度に宣言できるのと同じように、複数のtypedefを一度に宣言します。これらはすべてint
に基づくタイプですが、一部は複合タイプに変更されています。
それを別々の宣言に分割しましょう:
typedef int int_t; // simple int
typedef int *intp_t; // pointer to int
typedef int (&fp)(int, ulong); // reference to function returning int
typedef int arr_t[10]; // array of 10 ints
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];
と同等です:
typedef int int_t;
typedef int *intp_t;
typedef int (&fp)(int, mylong);
typedef int arr_t[10];
C++ 11標準には実際に同様の例があります。
C++ 11 7.1.3
typedef
指定子
typedef
- nameは、class
宣言(9.1)またはenum
宣言のように新しい型を導入しません。例:aftertypedef int MILES , * KLICKSP ;
構造
MILES distance ; extern KLICKSP metricp ;
すべて正しい宣言です。距離のタイプはintであり、
metricp
のタイプは「int
へのポインター」です。 -終了例
cdecl
コマンドがある場合は、それを使用してこれらの宣言をわかりやすく説明できます。
cdecl> explain int (&fp)(int, char)
declare fp as reference to function (int, char) returning int
cdecl> explain int (*fp)(int, char)
declare fp as pointer to function (int, char) returning int
cdecl
がない場合は、通常の方法でインストールできるはずです(たとえば、DebianタイプのシステムではSudo apt-get install cdecl
を使用)。
_(&fp)(int, mylong)
_の部分は、関数への参照を表します。この質問をしているという理由から、プログラマーがtypedef
の関数を使用することはお勧めしません。コードを見ている他の人を混乱させます。
私は彼らが次のようなものでtypedef
を使用していると推測しています:
_typedef unsigned long mylong; //for completeness
typedef int (&fp)(int, mylong);
int example(int param1, mylong param2);
int main() {
fp fp_function = example;
int x = fp_function(0, 1);
return 0;
}
int example(int param1, mylong param2) {
// does stuff here and returns reference
int x = param1;
return x;
}
_
ブライアンのコメントに従って編集:
int(&name)(...)
は関数参照呼び出されますname
(関数はintを返します)
int &name(...)
はname
と呼ばれる関数ですintへの参照を返す
int
参照を返す関数への参照は、次のようになります。typedef int &(&fp)(int, mylong)
(これはプログラムでコンパイルされますが、動作はテストされていません)。