move boost::bind to lambda

Viewed 45

I am doing some tutorial for boost::asio that is not very recent I think so I decide to make some adjustment.

In particular I remove all the boost::bind occurrence to lambdas as explained in https://www.youtube.com/watch?v=ZlHi8txU4aQ

for example:


// 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);
                               }
                              ));
  }

...
}

so far so good... it been compiled

the problem is the following transformation, practically I have no idea how to do that.

// 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());
      }));

 }
}

when I try to compile I get the following error.

====================[ 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.

can you give me some help?

thank you very much for any help Domenico

1 Answers
Related