c++ - Boost.Asio:不能使用 std::bind() 来指定回调
问题描述
我正在尝试使用 Boost.Asio 的async_read_until()
免费函数,但我无法使用std::bind()
. 我将这个成语用于其他 Boost.Asio 功能没有任何问题,所以我很困惑为什么它不适用于async_read_until()
.
这是我的例子:
#include <functional>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
class Test
{
public:
boost::asio::streambuf buf;
boost::asio::ip::tcp::socket sock;
Test(boost::asio::io_service& io) :
sock(io)
{
}
void readComplete(const boost::system::error_code& error,
std::size_t bytesTransferred)
{
}
void invoke()
{
boost::asio::async_read_until(sock,
buf,
'\n',
std::bind(&Test::readComplete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
};
int main(int argc, char** argv)
{
boost::asio::io_service io;
Test t(io);
t.invoke();
return 0;
}
在这种情况下,编译失败并出现以下错误(以及其他 template-compiler-error-barf):
In file included from /home/me/eclipse-workspace/practice/main.cpp:4:
In file included from /usr/include/boost/asio.hpp:91:
In file included from /usr/include/boost/asio/read_until.hpp:921:
/usr/include/boost/asio/impl/read_until.hpp:707:3: error: static_assert failed "ReadHandler type requirements not met"
BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/detail/handler_type_requirements.hpp:153:3: note: expanded from macro 'BOOST_ASIO_READ_HANDLER_CHECK'
BOOST_ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
^
/usr/include/boost/asio/detail/handler_type_requirements.hpp:105:6: note: expanded from macro 'BOOST_ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT'
static_assert(expr, msg);
^ ~~~~
/home/me/eclipse-workspace/practice/main.cpp:24:22: note: in instantiation of function template specialization 'boost::asio::async_read_until<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, std::_Bind<std::_Mem_fn<void (Test::*)(const boost::system::error_code &, unsigned long)>
(Test *, boost::arg<1> (*)(), boost::arg<2> (*)())> >' requested here
boost::asio::async_read_until(sock,
^
所以它告诉我我的函数签名是错误的,它似乎不是。
我不明白为什么它不起作用,我更不明白的是,如果我只是换掉它std::bind()
,boost::bind()
它就可以构建并完全正常工作。有人可以帮我理解这一点吗?
仅供参考,我正在使用 Boost 1.58.0(来自 Ubuntu 16.04 Universe 存储库)和带有 C++11 的 clang++ 3.8。
解决方案
不幸的是,您正在混合和匹配bind
s:
std::bind(&Test::readComplete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
唯一的boost::asio::placeholders
工作与boost::bind
,不与std::bind
。
从docs,您想要:
std::bind(&Test::readComplete,
this,
std::placeholders::_1,
std::placeholders::_2));
或者
boost::bind(&Test::readComplete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
我不明白为什么boost
不只是说它的占位符是std
占位符:
namespace std {
template <int I>
struct is_placeholder<boost::arg<I>>
: integral_constant<int, I>
{ };
}
我想有充分的理由吗?
推荐阅读
- java - 如果我在代码中将其与隐式等待一起使用,则显式等待不起作用
- angular - 取消订阅 switchmap 内部 observable,同时保持源 observable 处于活动状态 - Angular / RxJS
- amazon-web-services - 是否有任何现成的连接器可以从 Kafka 主题读取消息并插入 AWS Neptune?
- java - 如何转换通量
- > 进入单声道
- >
- evaluator - 具有幂运算符的表达式求值器中的项的优先级和关联
- angular - Angular Material mat-form-field 输入字段图标
- javascript - 设置 onchange 以使用 JS 或 JQuery 进行选择
- javascript - Vuejs yandex地图方向路线问题?
- mongodb - Docker Compose MongoDB Config /etc/mongodb.conf: 是一个目录
- python-3.x - Tensorflow map_fn Error PartialTensorShape:合并期间不兼容的等级