boost :: asio如何将成员函数传递给concector.async_accept()
boost::asio how to pass member function to acceptor.async_accept()
我试图将成员函数作为accepthandler传递给boost :: asio的async_accept()方法。我得到一个汇编错误,说:
accepthandler类型要求未满足
来自链接线:
//如果您在以下行中遇到错误,则意味着您的处理程序不符合Accepthandler的已记录类型要求。
文档说处理程序必须看起来像这样:
void accept_handler(const boost::system::error_code& error) //documentation
{
if (!error)
{
// Accept succeeded.
}
}
我的成员功能看起来像这样:
void WifiConnector::onAccept(const boost::system::error_code &ec) //my code
{
if (ec) {
std::cout << ec.message();
return;
}
socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler);
}
我没有发现任何区别。
,但我必须调用accceptor.async_accept()方法:
acceptor.async_accept(socket, &WifiConnector::onAccept); //my code
而不是
acceptor.async_accept(socket, accept_handler); //documentation
因为我假设这是一个成员函数。如果我尝试像文档所建议的那样通过它:
acceptor.async_accept(socket, onAccept); //my code
有一个错误说:没有超载函数的实例。
是错误的,因为我以错误的方式传递了成员函数,还是我在做什么?
编辑:我正在从容纳受体等的对象中调用async_accept()方法。
提升文档提到了它如何将非静态方法传递给受体
摘录从上述链接:
void my_class::accept_handler(
const boost::system::error_code& ec)
{
...
}
...
acceptor.async_accept(...,
boost::bind(&my_class::accept_handler,
this, boost::asio::placeholders::error));
如果您的类,可以将this
替换为实例。
错误是因为我以错误的方式传递了成员功能,还是我在做什么错?
调用普通函数和调用(非静态)成员函数是有区别的。后一个只能与适当的对象一起调用。因此,您必须使用众多方法之一来转发呼叫。最简单的方法是使用lambda:
WifiConnector wifi;
...
acceptor.async_accept(socket, [&wifi] (const auto& ec) { wifi.onAccept(ec); } );
请注意,您必须对WiFi对象的寿命进行一些认真的想法,因为其他线程现在可以通过引用访问它,并依赖于拥有的线程使对象保持生存。例如,传递shared_ptr
或weak_ptr
对象而不是普通引用(可能悬挂)并不是ASIO回调内部的罕见练习。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用用户定义的参数调用future/async并调用类方法
- 使用 std::async 时死锁,将来作为成员
- 为什么我不能将引用作为 std::async 的函数参数传递
- std::async from std::async in windows xp
- Google Cloud Pubsub Async Streaming API in C++
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- std::async 不会立即调用
- async中没有匹配的函数(模板中未解析的类型)
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 可能的 std::async 实现错误 Windows
- 为什么使用线程池时嵌套调用 boost::async 会阻塞?
- C++从 std::async 函数读取命名空间中的全局变量标志
- std::async 究竟是如何执行的?
- 使用 g++8 和 c++20 的 std::async 编译问题
- 如何有效地使用 std::async 对指针数组执行操作