2016-11-25 11 views
-2

メソッドの型自体のポインタパラメータを含むメソッドtypedefを宣言しようとしています - これは可能ですか?メソッドポインタをtypedefメソッドのパラメータとして宣言する方法

方法は次のようになります。myFuncFuncTypeに一致する宣言です

void myFunc(FuncType* pFunc, int a) {} 

をので、私は、変数を設定し、このようにそれを呼び出すことができます。私が試した

FuncType f = myFunc; 
f(&f, 5); 

このメソッドと一致するtypedefを次のように宣言します。

typedef void (*FuncType)(FuncType*, int); 

しかし、完全に宣言される前にFuncTypeが必要であるため、これは機能しません。私は、voidポインタにパラメータを設定することでこれを修正できますが、これを回避する方法がいくつかあります。おそらくFuncTypeの前方宣言の何らかの形で?

答えて

1

これは不可能です;関数はそれ自身の型のパラメータを取ることはできません(またはそのようなものを返します)。
これはすべての合理的に強力なタイプのシステムの場合です。

唯一の回避策は、void*で行ったように間接参照を別の型で導入することです。

これは、クラスが自分自身のインスタンスをメンバーとして含むことができないことに似ています。これは、ポインタや参照を使って間接的に処理することで回避できます。

+0

ええ、私はそう思った。私は型へのポインタとしてパラメータを宣言することによって、構造体やクラスと同じ方法で取り除くことができると考えました。明らかにそうではありません。 – adelphus

0

はこのようなtypedefを宣言するだけでなく、このような関数を宣言することもできません。それは無限再帰をもたらす。

ここでは、そのような関数の宣言は次のようになり方法は次のとおりです。

...はに拡大する
void myFunc(void (*pFunc)(...), int a); 

void (*pFunc)(...), int) 

...はに拡大する場所:

void (*pFunc)(...), int) 
+0

再帰はどこですか?私がやっているのは、関数を呼び出してポインタと整数を渡すことだけです。 – adelphus

+0

@adelphus "再帰"は型レベルであり、関数自体ではありません。 – molbdnilo

+0

よかったです。私が同意しない理由は、パラメータが型自体ではなく、型に対する**ポインタ**であるということです。それは、構造体やクラスを宣言して、自分自身のメンバーを入れる方法です。構造体やクラスへのポインタを宣言し、型システムがそれを整理するために管理します。 – adelphus

関連する問題