长例子的问题是
my_func(_1,s)
std::bind
(或
boost::bind
您发布的替代代码确实有效,但由于中的代码,整个示例无法编译
do_callbacks
:
void do_callbacks() {
for_each(m_cb.begin(), m_cb.end(), this);
}
this
B*
,不可调用。如果你定义一个
result_type
typedef以匹配
operator()
std::ref(*this)
相反。以下代码在MSVC10下编译并运行:
#include <functional>
#include <vector>
#include <iostream>
#include <algorithm>
class A {
public:
void print(std::string &s) {
std::cout << s.c_str() << std::endl;
}
};
typedef std::function<void(std::string&)> another_callback;
typedef std::function<void()> callback;
typedef std::vector<callback> callback_vector;
typedef std::vector<another_callback> another_callback_vector;
class B {
public:
void add_callback(callback cb) {
m_cb.push_back(cb);
}
void add_another_callback(another_callback acb) {
m_acb.push_back(acb);
}
void do_callbacks() {
std::for_each(m_cb.begin(), m_cb.end(), std::ref(*this));
}
void do_another_callbacks(std::string &s) {
std::for_each(m_acb.begin(), m_acb.end(), [&s](another_callback acb) {
acb(s);
});
}
typedef void result_type;
void operator() (callback cb) { cb(); }
private:
callback_vector m_cb;
another_callback_vector m_acb;
};
int main() {
A a;
B b;
std::string s("message");
std::string q("question");
b.add_callback(std::bind(&A::print, &a, s));
b.add_callback(std::bind(&A::print, &a, q));
b.add_another_callback(std::bind(&A::print, &a, std::placeholders::_1));
b.do_callbacks();
b.do_another_callbacks(s);
b.do_another_callbacks(q);
}