【发布时间】:2013-09-08 03:31:46
【问题描述】:
假设我有一个名为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));
}
【问题讨论】:
标签: c++ boost-bind boost-function boost-phoenix boost-lambda