5

これはすでに長い間議論されてきたトピックであることは知っていますが、私を満足させる答えをまだ見つけることができませんでした.

要するに質問: C++11 の function::target() 機能を使用しても、メンバー関数ポインターを c スタイルのメソッドに渡すことはできませんか?

次のコードは機能しません: mbf.target() への呼び出しは 0 を返すため、SEGFAULT が生成されます。メンバー関数をジェネリック関数オブジェクトにバインドしているため、その理由がわかりません。そのため、型は問題ないはずです。

私は何を間違っていますか、それとも不可能なことをしようとしていますか?

#include <functional>
using namespace std;

typedef void (*CBType)(int, int);
CBType myCB = 0;

void regCallback(CBType cb)
{
    myCB = cb;
}

class A
{
public:
    void memberCB(int a, int b) {}

    void registerCallback()
    {
        auto mbMem = mem_fn(&A::memberCB);
        function<void(int,int)> mbf =
            bind(mbMem, *this, placeholders::_1, placeholders::_2);
        regCallback(*mbf.target<void(*)(int,int)>());
    }
};


int main()
{
    A inst;
    inst.registerCallback();
}
4

1 に答える 1

3

あなたのメンバー関数は typevoid (*)(int, int)ではなく、 typevoid (A::*)(int, int)です。したがって、間違った型にキャストしようとするとtarget返されます。nullptrを作ることをお勧めしCBTypeますstd::function<void(int, int)>

于 2013-05-13T12:11:49.527 に答える