Как передать boost callback как параметр метода? - PullRequest
0 голосов
/ 06 июля 2018

Я не могу передать один из методов обратного вызова boost в мой метод.

Короткая история: я пытаюсь работать с boost::asio::ip::tcp::socket Я завернул сокет в свой класс SerializationSocket.

ВВ какой-то момент мне нужно работать с асинхронным принятием, поэтому мне нужно передать обратный вызов в SerializationSocket.

Серверная часть:

void accept_handler(const boost::system::error_code& error)
{}

SerializationSocket socket(1950, accept_handler);

SerializationSocket:

typedef void (SerializationSocket_cb)
     (const boost::system::error_code&, boost::asio::ip::tcp::socket);

...

SerializationSocket::SerializationSocket(int port,
    SerializationSocket_cb cb) {
    ...
    acceptor.async_accept(*mp_Socket, cb);  // this line is SerializationSocket.h:44
}

Сообщение об ошибке говорит мне, что что-то не так с моим cb типом:

/home/Common/Libs/boost_1_67_0/include/boost/asio/basic_socket_acceptor.hpp: In instantiation of ‘typename boost::asio::async_result<typename std::decay<WriteHandler>::type, void(boost::system::error_code)>::return_type boost::asio::basic_socket_acceptor<Protocol>::async_accept(boost::asio::basic_socket<Protocol1>&, AcceptHandler&&, typename std::enable_if<std::is_convertible<Protocol, Protocol1>::value>::type*) [with Protocol1 = boost::asio::ip::tcp; AcceptHandler = void (*&)(const boost::system::error_code&, boost::asio::basic_stream_socket<boost::asio::ip::tcp>); Protocol = boost::asio::ip::tcp; typename boost::asio::async_result<typename std::decay<WriteHandler>::type, void(boost::system::error_code)>::return_type = void; typename std::enable_if<std::is_convertible<Protocol, Protocol1>::value>::type = void]’:
../../Common/SerializationSocket.h:44:45:   required from here
/home/Common/Libs/boost_1_67_0/include/boost/asio/detail/handler_type_requirements.hpp:105:6: error: static assertion failed: AcceptHandler type requirements not met
      static_assert(expr, msg);
      ^
/home/Common/Libs/boost_1_67_0/include/boost/asio/detail/handler_type_requirements.hpp:214:3: note: in expansion of macro ‘BOOST_ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT’
   BOOST_ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/Common/Libs/boost_1_67_0/include/boost/asio/basic_socket_acceptor.hpp:1262:5: note: in expansion of macro ‘BOOST_ASIO_ACCEPT_HANDLER_CHECK’
     BOOST_ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check;
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/Common/Libs/boost_1_67_0/include/boost/asio/detail/handler_type_requirements.hpp:228:36: error: too few arguments to function
         boost::asio::detail::lvref< \
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           asio_true_handler_type>()( \
           ~~~~~~~~~~~~~~~~~~~~~~~~~^~~
             boost::asio::detail::lvref<const boost::system::error_code>()), \

Вот документация буста, которую я использую .Когда я использую accept_handler прямо как acceptor.async_accept(*mp_Socket, accept_handler);, это работает.

1 Ответ

0 голосов
/ 06 июля 2018

Ну, ответ можно найти в форсированной документации . Это довольно просто

Подпись функции обработчика должна быть:

void handler( const boost::system::error_code& error );

Пока ваш обработчик имеет тип:

typedef void (SerializationSocket_cb) (const boost::system::error_code&, boost::asio::ip::tcp::socket);
...