移动boost::绑定到lambda



我正在为boost::asio做一些教程,我想这不是最近的,所以我决定做一些调整。

特别是,我删除了所有boost::bind事件到lambdas,如中所述https://www.youtube.com/watch?v=ZlHi8txU4aQ

例如:


// Class Connection definition and its members declaration
class Connection : public std::enable_shared_from_this<Connection> {
friend class Acceptor;
private:
void StartSend();
void StartRecv(std::int32_t total_bytes);
...
}
...
// Connection::StartRecv definition
void Connection::StartRecv(int32_t total_bytes) {
/*
m_socket.async_read_some(
_asio::buffer(m_recv_buffer), 
m_io_strand.wrap(
boost::bind(&Connection::HandleRecv, 
shared_from_this(), 
boost::placeholders::_1, 
boost::placeholders::_2)));      
*/
{
auto _this(shared_from_this());
m_socket.async_read_some(_asio::buffer(m_recv_buffer), 
m_io_strand.wrap(
[_this](auto &&arg1, auto &&arg2) {
_this->HandleRecv(arg1, arg2);
}
));
}
...
}

到目前为止还不错。。。它被编译为

问题是下面的转换,实际上我不知道该怎么做。

// Connection::StartSend definition
void Connection::StartSend() {
...
/*            
_asio::async_write(
m_socket, 
_asio::buffer(
m_pending_sends.front()), 
m_io_strand.wrap(
boost::bind(&Connection::HandleSend, shared_from_this(), 
boost::asio::placeholders::error, m_pending_sends.begin())));
*/
{
auto _this= shared_from_this();
_asio::async_write(
m_socket, 
_asio::buffer(m_pending_sends.front()), 
m_io_strand.wrap(
[&,_this](const boost::system::error_code &arg1,
[[maybe_unused]] std::list<std::vector<boost::uint8_t> >::iterator itr){
_this->HandleSend(arg1, m_pending_sends.begin());
}));
}
}

当我试图编译时,我得到了以下错误。

====================[ Build | asio01 | Debug ]==================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/domeniconeri/CLionProjects/asioExamples/asio01/cmake-build-debug --target asio01 -j 12
[1/2] Building CXX object main/CMakeFiles/asio01.dir/src/asio01/wrapper.cpp.o
FAILED: main/CMakeFiles/asio01.dir/src/asio01/wrapper.cpp.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -I/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0 -I/Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk -Wall -Wextra -pedantic -Werror -std=c++20 -MD -MT main/CMakeFiles/asio01.dir/src/asio01/wrapper.cpp.o -MF main/CMakeFiles/asio01.dir/src/asio01/wrapper.cpp.o.d -o main/CMakeFiles/asio01.dir/src/asio01/wrapper.cpp.o -c /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp
In file included from /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:3:
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/bind.hpp:36:1: warning: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior. [-W#pragma-messages]
BOOST_PRAGMA_MESSAGE(
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/config/pragma_message.hpp:24:34: note: expanded from macro 'BOOST_PRAGMA_MESSAGE'
# define BOOST_PRAGMA_MESSAGE(x) _Pragma(BOOST_STRINGIZE(message(x)))
^
<scratch space>:5:2: note: expanded from here
message("The practice of declaring the Bind placeholders (_1, _2, ...) " "in the global namespace is deprecated. Please use " "<boost/bind/bind.hpp> + using namespace boost::placeholders, " "or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.")
^
In file included from /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:2:
In file included from /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.h:7:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio.hpp:25:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/awaitable.hpp:140:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/impl/awaitable.hpp:29:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/post.hpp:196:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/impl/post.hpp:21:
In file included from /Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/work_dispatcher.hpp:19:
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/bind_handler.hpp:289:5: error: no matching function for call to object of type '(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25)'
BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/config.hpp:137:42: note: expanded from macro 'BOOST_ASIO_MOVE_OR_LVALUE'
# define BOOST_ASIO_MOVE_OR_LVALUE(type) static_cast<type&&>
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/handler_invoke_hook.hpp:88:3: note: in instantiation of member function 'boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>::operator()' requested here
function();
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/handler_invoke_helpers.hpp:54:3: note: in instantiation of function template specialization 'boost::asio::asio_handler_invoke<boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>>' requested here
asio_handler_invoke(function, boost::asio::detail::addressof(context));
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/bind_handler.hpp:344:38: note: in instantiation of function template specialization 'boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25)>' requested here
boost_asio_handler_invoke_helpers::invoke(
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/handler_invoke_helpers.hpp:54:3: note: in instantiation of function template specialization 'boost::asio::detail::asio_handler_invoke<boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>' requested here
asio_handler_invoke(function, boost::asio::detail::addressof(context));
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/impl/strand_service.hpp:44:40: note: in instantiation of function template specialization 'boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>, boost::asio::detail::binder2<(lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::system::error_code, unsigned long>>' requested here
boost_asio_handler_invoke_helpers::invoke(handler, handler);
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/io_context_strand.hpp:344:22: note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
self->service_.dispatch(self->impl_, handler2.value);
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/impl/write.hpp:460:5: note: in instantiation of member function 'boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffers_1, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>>::operator()' requested here
detail::write_op<AsyncWriteStream, ConstBufferSequence,
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/impl/write.hpp:494:7: note: in instantiation of function template specialization 'boost::asio::detail::start_write_buffer_sequence_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffers_1, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>>' requested here
start_write_buffer_sequence_op(stream_, buffers,
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/async_result.hpp:482:5: note: in instantiation of function template specialization 'boost::asio::detail::initiate_async_write_buffer_sequence<boost::asio::basic_stream_socket<boost::asio::ip::tcp>>::operator()<boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>, boost::asio::mutable_buffers_1, boost::asio::detail::transfer_all_t>' requested here
BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/detail/config.hpp:135:37: note: expanded from macro 'BOOST_ASIO_MOVE_CAST'
# define BOOST_ASIO_MOVE_CAST(type) static_cast<type&&>
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/async_result.hpp:862:21: note: in instantiation of function template specialization 'boost::asio::detail::completion_handler_async_result<boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>, void (boost::system::error_code, unsigned long)>::initiate<boost::asio::detail::initiate_async_write_buffer_sequence<boost::asio::basic_stream_socket<boost::asio::ip::tcp>>, boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>, const boost::asio::mutable_buffers_1 &, boost::asio::detail::transfer_all_t>' requested here
Signatures...>::initiate(BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
^
/Users/domeniconeri/CLionProjects/Libraries/boost_1_79_0/boost/asio/impl/write.hpp:558:10: note: in instantiation of function template specialization 'boost::asio::async_initiate<boost::asio::detail::wrapped_handler<boost::asio::io_context::strand, (lambda at /Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25), boost::asio::detail::is_continuation_if_running>, void (boost::system::error_code, unsigned long), boost::asio::detail::initiate_async_write_buffer_sequence<boost::asio::basic_stream_socket<boost::asio::ip::tcp>>, const boost::asio::mutable_buffers_1 &, boost::asio::detail::transfer_all_t>' requested here
return async_initiate<WriteToken,
^
/Users/domeniconeri/CLionProjects/asioExamples/asio01/main/src/asio01/wrapper.cpp:216:25: note: candidate function not viable: no known conversion from 'const unsigned long' to 'std::list<std::vector<boost::uint8_t>>::iterator' (aka '__list_iterator<std::vector<unsigned char>, void *>') for 2nd argument
[&,_this](const boost::system::error_code &arg1,[[maybe_unused]] std::list<std::vector<boost::uint8_t> >::iterator itr){
^
1 warning and 1 error generated.
ninja: build stopped: subcommand failed.

你能帮我一下吗?

非常感谢你的帮助Domenico

回调lambda需要接收std::size_t bytes_transferred参数,而不是列表迭代器。看见https://www.boost.org/doc/libs/1_80_0/doc/html/boost_asio/reference/async_write/overload1.html

最新更新