使用boost phoenix lambda和io_service

时间:2017-12-28 10:18:31

标签: c++ boost lambda boost-phoenix

我使用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可以有相同的行为吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

最显着的区别是占位符(不要使用std::place_holders::_1_2 ...但boost::phoenix::arg_names::arg1arg2 ...)。

但是,简单地将boost::bind替换为std::bindboost::lambda::bindboost::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_;
};