簡體   English   中英

Noob boost :: bind成員函數回調問題

[英]Noob boost::bind member function callback question

#include <boost/bind.hpp>
#include <iostream>

using namespace std;
using boost::bind;

class A {
public:
    void print(string &s) {
        cout << s.c_str() << endl;
    }
};


typedef void (*callback)();

class B {
public:
    void set_callback(callback cb) {
        m_cb = cb;
    }

    void do_callback() {
        m_cb();
    }

private:
    callback m_cb;
};

void main() {
    A a;
    B b;
    string s("message");
    b.set_callback(bind(A::print, &a, s));
    b.do_callback();

}

所以我要做的是在激活b的回調時將A流“消息”的打印方法設置為cout。 我從msvc10得到了意外數量的參數錯誤。 我確定這是超級noob基本的,我很抱歉。

replace typedef void (*callback)(); with typedef boost::function<void()> callback;

綁定函數不會生成普通函數,因此您不能將其存儲在常規函數指針中。 但是, boost::function能夠處理任何東西 ,只要它可以使用正確的簽名進行調用,這就是你想要的。 它將與函數指針或使用bind創建的仿函數一起使用。

在對您的代碼進行一些更正之后,我想出了這個:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <iostream>

// i prefer explicit namespaces, but that's a matter of preference

class A {
public:
    // prefer const refs to regular refs unless you need to modify the argument!
    void print(const std::string &s) {
        // no need for .c_str() here, cout knows how to output a std::string just fine :-)
        std::cout << s << std::endl;
    }
};


// holds any arity 0 callable "thing" which returns void
typedef boost::function<void()> callback;

class B {
public:
    void set_callback(callback cb) {
        m_cb = cb;
    }

    void do_callback() {
        m_cb();
    }

private:
    callback m_cb;
};

void regular_function() {
    std::cout << "regular!" << std::endl;
}

// the return type for main is int, never anything else
// however, in c++, you may omit the "return 0;" from main (and only main)
// which will have the same effect as if you had a "return 0;" as the last line
// of main
int main() {
    A a;
    B b;
    std::string s("message");

    // you forget the "&" here before A::print!
    b.set_callback(boost::bind(&A::print, &a, s));
    b.do_callback();

    // this will work for regular function pointers too, yay!
    b.set_callback(regular_function);
    b.do_callback();

}

暫無
暫無

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

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