假设我有一个subscribe()
调用函数,它接受一个回调处理程序,当事件被触发时将调用它。
现在,我有另一个版本,称为subscribe2()
. 一切都是一样的,只是在触发时,它需要将其发布到事件队列中。它是使用原始实现的subscribe()
,带有一个名为 的辅助函数helper()
。它所做的只是将原始处理程序和任何其他参数绑定到仿函数中,然后调用postToEventQueue()
.
现在,我想知道有没有办法消除辅助函数,这样subsribe2()
我就可以以某种方式直接将函数和原始回调处理程序打包,postToTaskQueue()
并将其传递给 subscribe()
原因是我有很多不同的处理程序类型,到处引入辅助函数很乏味和累人。毕竟, boost::bind 应该在给定原始函数的情况下返回一个新函数,对吗?我正在尝试使用 boost::bind 直接生成辅助函数。
一种尝试是说
subscribe(boost::bind(boost::bind(postToTaskQueue, boost::bind(_1, _2)), cb, _1));
在subscribe2()
,但它不起作用。有可能吗?
请参阅下面的详细示例代码。谢谢!
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
typedef boost::function<void(int)> SomeCallback;
typedef boost::function<void()> Task;
void handler(int i){
std::cout << "i=" << i <<std::endl;
}
void subscribe(SomeCallback cb)
{
cb(100); //just invoke the callback for simplicity
}
void postToTaskQueue(Task t)
{
t(); // just invoke the task for simplicity
}
void helper(SomeCallback cb, int i)
{
Task t = boost::bind(cb, i);
postToTaskQueue(t);
}
void subscribe2(SomeCallback cb)
{
subscribe(boost::bind(helper, cb, _1));
// this does not work..
// subscribe(boost::bind(boost::bind(postToTaskQueue, boost::bind(_1, _2)), cb, _1));
}
int main()
{
subscribe(boost::bind(handler, _1));
subscribe2(boost::bind(handler, _1));
}