同じメンバー関数ポインター型を返すメンバー関数ポインターを C++ で宣言したい
これは機能しません:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
誰かが解決策を知っていますか?
同じメンバー関数ポインター型を返すメンバー関数ポインターを C++ で宣言したい
これは機能しません:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
誰かが解決策を知っていますか?
正確にそれを達成する方法はありません。実際、ここではメンバー関数に違いはありません。独自の関数型へのポインターを返す通常の関数を宣言する方法はありません。宣言は無限に再帰的になります。
通常の関数の場合、void (*)()
型を「ユニバーサル」関数ポインタ型として使用できます (void *
データ型によく使用されるのと同じように)。型になるメンバー関数ポインターの場合void (A::*)()
。reinterpret_cast
ただし、その目的のために使用する必要があります。ただし、この使用法 (往復変換) は、たまたま の動作reinterpret_cast
が定義されている場合のものです。
もちろん、キャストを使用してポインターをその型との間で変換する必要があります。私の知る限り、キャストを行う中間の一時テンプレート オブジェクトを使用したエレガントなテンプレート ベースのソリューションがあります。
このGotW エントリも参照してください。
追伸、void *
関数ポインターの中間型として型を使用することは、言語によって禁止されていることに注意してください。このような違法な使用は、通常の関数ポインターでは「機能している」ように見えるかもしれませんが、メンバー関数ポインターで機能する可能性はまったくありません。メンバー関数ポインターは、通常、ポインターのサイズよりも大きいサイズの自明でないオブジェクトですvoid *
。
AndreyT はGotW #57で最良の回答を参照しているので、ここで複製することもできます。
class MyClass {
public:
struct FunctionPtrProxy;
typedef FunctionPtrProxy (MyClass::*FunctionPtr)();
struct FunctionPtrProxy
{
FunctionPtrProxy(FunctionPtr pp ) : p( pp ) { }
operator FunctionPtr() { return p; }
FunctionPtr p;
}
}
あなたがしようとしていることは不可能です-関数の戻り値の型は関数自体の型であり、まだ知られていないため、無限サイクルにつながります。