3

これどうやってするの?(次のコードは機能しませんが、アイデアが説明されていることを願っています。)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

次のような方法で Caller を呼び出したい:

Caller(ToBeCalled, "stuff")

渡す必要があると思われるパラメーターを指定してCaller呼び出します。ToBeCalled可能であれば、クラスのプライベート部分にすべてをカプセル化しておきたいと思います。実際には、 のような関数が約 50 個あるToBeCalledため、これを回避する方法がわかりません。

提案をありがとう。:)

4

2 に答える 2

7

あなたはそこまでの道のりです。typedef からの戻り値の型がありません。

typedef int (MyClass::*FuncSig)(int, char*);

今、あなたはそれを適切に使用する必要があります:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

FuncSig単純なインスタンスを渡したいのではなく、 FuncSig*-- aFuncSig*はメンバー関数へのポインターへのポインターであり、余分な不要なレベルの間接参照があります。次に、アロースター演算子 (正式な名前ではありません) を使用して呼び出します。

(object_to_be_called_on ->* func)(args);

ポインター以外のオブジェクト (スタック上のオブジェクトやオブジェクトへの参照など) の場合は、ドットスター演算子を使用します。

MyClass x;
(x .* func)(args);

また、演算子の優先順位にも注意してください。アロースター演算子とドットスター演算子は関数呼び出しよりも優先順位が低いため、上記で行ったように余分な括弧を挿入する必要があります。

于 2009-11-10T04:23:20.343 に答える
0

すでに試したとCaller(MyClass::ToBeCalled, "stuff")思いますが、関数ポインタが必要な特別な理由はありますか? また、実際のコンパイル エラーを投稿してください。

于 2009-11-10T04:23:40.967 に答える