2

メンバー関数ポインターを静的関数に変換するにはどうすればよいですか?

これが私のコードです:

class ClassA
{
public:
    int n;
    void func();
};
void ClassA::func()
{
    n = 89;
}

class ClassB
{
public:
    float f1;
    float f2;
    void func(float f);
};
void ClassB::func( float f )
{
    f1 += f;
    f2 += f;
}


int main (int argc, char *argv[]) 
{
    ClassA* a = new ClassA;
    ClassB* b = new ClassB;

    //PROBLEM IS HERE
    void (* pf_func1)(void*) = ClassA.func;
    void (* pf_func2)(void*, float) = ClassB.func;


    pf_func1(a);
    pf_func2(b, 10);
}
4

2 に答える 2

2

std::bind関連するクラスのインスタンスにそれを行うことができます:

auto func1 = std::bind(&ClassA::func, a);
func1();

これにより、メンバー関数がにバインドClass::funcされaます。そして同様に:

auto func2 = std::bind(&ClassB::func, b, std::placeholders::_1);
func2(10.0f);

または、を使用std::mem_fnして、呼び出されたオブジェクトを簡単に変更し、要求した構文を提供することもできます。

auto func1 = std::mem_fn(&ClassA::func);
func1(a);
auto func2 = std::mem_fn(&ClassB::func);
func2(b, 10.0f);

どちらの場合もそうfunc1func2はなく、実際には関数ポインタではありませんが、それらはそれらのように動作します。から返されるタイプstd::bindstd::mem_fn実装で定義されたタイプ。ただし、どちらもに変換できstd::functionます。

于 2013-02-23T12:47:01.687 に答える
-1
void(ClassA::*pf1)() = &ClassA::func;
void(ClassB::*pf2)(float) = &ClassB::func;
void (__thiscall * pf_func1)(void*) = (void (__thiscall *)(void*)) ((void*&)pf1);
void (__thiscall * pf_func2)(void*, float) = (void (__thiscall *)(void*, float)) ((void*&)pf2);

解決済み

:)

于 2013-02-24T05:33:14.727 に答える