我使用boost io_service以异步方式运行方法:
void my_class::completion_handler()
{
...
}
m_io_service.post(boost::bind(&my_class::completion_handler, this));
我想使用lambda表达式而不是boost :: bind(见下文),以避免为每个处理程序创建方法,但我使用的是不完全支持C ++ 11的C ++编译器:
m_io_service.post([this](){ ... });
使用phoenix lambda可以有相同的行为吗?
谢谢。
答案 0 :(得分:1)
是的,这是可能的。
最显着的区别是占位符(不要使用std::place_holders::_1
,_2
...但boost::phoenix::arg_names::arg1
,arg2
...)。
但是,简单地将boost::bind
替换为std::bind
,boost::lambda::bind
或boost::phoenix::bind
当然最终无用。
相反,你可以使用凤凰演员组成“lambdas”,例如。
namespace phx = boost::phoenix;
boost::mutex mx;
boost::condition_variable cv;
boost::unique_lock<boost::mutex> lk(mx);
vc.wait(lk, phx::ref(m_queue_size) > 0);
在这方面,成员调用很棘手。
好消息是,Phoenix提供了许多STL操作的实现,如size()
,empty()
,push_back()
等。
在此队列实施中类似地使用Phoenix:Boost group_threads Maximal number of parallel thread例如asio::io_service and thread_group lifecycle issue)。
boost::fusion::function<>
您可以使用BOOST_PHOENIX_ADAPT_FUNCTION
调整自由函数,使用BOOST_PHOENIX_ADAPT_CALLABLE
调整函数对象。但是在后一种情况下,使用boost::fusion::function<>
可能更优雅:
struct MyType {
MyType()
: complete_(complete_f { this })
{ }
void doSomething() { }
private:
struct complete_f {
MyType* _this;
void operator()() const {
// do something with _this, e.g
this->doSomething();
}
};
boost::phoenix::function<complete_f> complete_;
};