7

同じメンバー関数ポインター型を返すメンバー関数ポインターを C++ で宣言したい

これは機能しません:

class MyClass { 
public: 
        typedef FunctionPtr (MyClass::*FunctionPtr)(); 
}

誰かが解決策を知っていますか?

4

3 に答える 3

5

正確にそれを達成する方法はありません。実際、ここではメンバー関数に違いはありません。独自の関数型へのポインターを返す通常の関数を宣言する方法はありません。宣言は無限に再帰的になります。

通常の関数の場合、void (*)()型を「ユニバーサル」関数ポインタ型として使用できます (void *データ型によく使用されるのと同じように)。型になるメンバー関数ポインターの場合void (A::*)()reinterpret_castただし、その目的のために使用する必要があります。ただし、この使用法 (往復変換) は、たまたま の動作reinterpret_castが定義されている場合のものです。

もちろん、キャストを使用してポインターをその型との間で変換する必要があります。私の知る限り、キャストを行う中間の一時テンプレート オブジェクトを使用したエレガントなテンプレート ベースのソリューションがあります。

このGotW エントリも参照してください。

追伸、void *関数ポインターの中間型として型を使用することは、言語によって禁止されていることに注意してください。このような違法な使用は、通常の関数ポインターでは「機能している」ように見えるかもしれませんが、メンバー関数ポインターで機能する可能性はまったくありません。メンバー関数ポインターは、通常、ポインターのサイズよりも大きいサイズの自明でないオブジェクトですvoid *

于 2010-07-02T20:28:08.283 に答える
5

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;
        }

} 
于 2010-07-02T21:26:46.293 に答える
0

あなたがしようとしていることは不可能です-関数の戻り値の型は関数自体の型であり、まだ知られていないため、無限サイクルにつながります。

于 2010-07-02T20:28:46.210 に答える