有没有办法使这个异步读取和写入链更清晰

时间:2018-02-20 06:47:57

标签: c++ lambda c++14 metaprogramming

我的session启用shared_from_this,可以在对象销毁之前调用boost::async_writeboost::asio::ip::tcp::socket::async_read。问题是,当我想链接一些async_writeasync_read函数时,为了创建一个状态机,代码变得丑陋:

template <typename ArrType, std::size_t N> inline decltype(auto) boost_buf(ArrType (&arr)[N])
{
    return boost::asio::buffer(arr, N);
}

...
// Inside session class
async_write(socket, boost_buf(header), [self = shared_from_this()](boost_err_code ec,
                                                                            std::size_t /* len */) {
    if (!ec)
        self->socket.async_read_some(boost_buf(self->data), [self = std::move(self)](boost_err_code ec,
                                                                                     std::size_t /* len */) {
            if (!ec)
                async_write(
                    self->socket, boost_buf(respons1),
                    [self = std::move(self)](boost_err_code ec, std::size_t /* len */) {
                        if (!ec)
                            self->socket.async_read_some( ...

有没有办法将其转换为类似的东西:

a_write(header, ()[] {
    a_read_into(buf, ()[] {
        a_write(response1, ...

我可以使用bind函数,并为每个lambda创建一个private方法,但我希望状态机在一个适合我的屏幕的范围内可见。我不关心回复的内容。

我一直试图让a_writea_read_into看起来像这样:

template <typename F>
void a_write(   tcp::socket &socket, 
                const std::string &data,
                std::shared_ptr<mbarx_echo_mock_session> &&session,
                F && f );

但是在链接第二个函数时会出现问题。

0 个答案:

没有答案