簡體   English   中英

如何使用std :: bind將成員函數設置為回調

[英]How to set a member function as callback using std::bind

我有一個用於存儲函數回調的類,而另一個具有要設置為回調的成員函數的類,如下所示:

using namespace std::placeholders;

class A {
    typedef std::function<void(int)> Callback;
    Callback callback;
    A() {}
    A(Callback f) : callback(f);
    do_something(int x) { callback(x); }
}

class B {
    A a;
    void function(int x) { printf("%d", x); }
    B() 
    {
         a = A( std::bind(&B::function, this, _1) );
    }

當我這樣做並嘗試調用回調函數時,在MSVC上收到無效的函數調用錯誤。 我在這里做錯了什么?

編輯2014年1月21日

正如axalo所指出的,此代碼沒有錯誤(除了一些錯字)。 它確實可以編譯。 但是我正在做一些測試,並且得到一種奇怪的行為:當我在構造函數上使用“ bind”和“ this”指針時,即

B() { a = A( std::bind( &B::function, this, _1)); }

'this'指針不同於指向類實例的實際指針,而如果我這樣做:

void helper() = { a = A( std::bind( &B::function, this, _1)); }
B() {  }

並從實例調用helper(),我得到了正確的“ this”指針。 這種行為正確嗎? 我不應該相信構造函數中“ this”指針的值嗎?

謝謝。

問題中的代碼無法編譯。 但是在修復了一些語法錯誤等之后,您的代碼實際上就可以編譯了。

using namespace std::placeholders;

class A
{
public:
    typedef std::function<void(int)> Callback;
    Callback callback;

    A() {}

    A(Callback f) : callback(f) {}

    void do_something(int x)
    {
        callback(x);
    }
};

class B
{
    A a;

    void function(int x)
    {
        printf("%d", x);
    }

    B()
    {
        a = A(std::bind(&B::function, this, _1));
    }
};

將其與您的代碼進行比較,以找出錯誤的出處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM