简体   繁体   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();

}

So what I'm trying to do is to have the print method of A stream "message" to cout when b's callback is activated. 所以我要做的是在激活b的回调时将A流“消息”的打印方法设置为cout。 I'm getting an unexpected number of arguments error from msvc10. 我从msvc10得到了意外数量的参数错误。 I'm sure this is super noob basic and I'm sorry in advance. 我确定这是超级noob基本的,我很抱歉。

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

A bound function doesn't produce an ordinary function, so you cannot just store it in a regular function pointer. 绑定函数不会生成普通函数,因此您不能将其存储在常规函数指针中。 However, boost::function is able to handle anything as long as it is callable with the correct signature, so that's what you want. 但是, boost::function能够处理任何东西 ,只要它可以使用正确的签名进行调用,这就是你想要的。 It will work with a function pointer, or a functor created with bind. 它将与函数指针或使用bind创建的仿函数一起使用。

After a few corrections to your code, I came up with this: 在对您的代码进行一些更正之后,我想出了这个:

#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