2010-05-25 91 views
3
#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的回调被激活时,让流“message”的打印方法给cout。我收到来自msvc10的意外数量的参数错误。我确定这是超级新手基本,我很抱歉提前。Noob boost :: bind成员函数回调问题

回答

9

typedef boost::function<void()> callback;

一个绑定的功能替代typedef void (*callback)();不会产生普通的功能,所以你不能仅仅将其存储在一个普通函数指针。然而,boost::function能够处理任何东西,只要它可以用正确的签名调用,所以这就是你想要的。它将与函数指针或通过绑定创建的仿函数一起工作。

一些修正你的代码后,我想出了这个:

#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(); 

} 
+0

感谢您的帮助。 – shaz 2010-05-25 19:29:53

相关问题