我的session
启用shared_from_this
,可以在对象销毁之前调用boost::async_write
和boost::asio::ip::tcp::socket::async_read
。问题是,当我想链接一些async_write
和async_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_write
和a_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 );
但是在链接第二个函数时会出现问题。