boost::asio::deadline_timer绑定到多态套接字类指针
boost::asio::deadline_timer binding to a polymorphic socket class pointer
我的方案(或多或少)如下:
asio_socket
是具有单一纯虚拟方法的abc:
virtual void schedule(
boost::asio::ip::tcp::resolver::query &,
boost::asio::ip::tcp::resolver &,
boost::asio::io_service &
) = 0;
另一个类asio_socket_http
继承自它,也继承自另一个asio_helper
。另一类CCD_ 4也遵循相同的方案。
asio_socket_http
实现了用于http连接的asio_async处理程序。
其他类(定义特定的URI/URL相关操作)继承自asio_socket_http
或asio_socket_https
。
存在一个作业调度程序:
void run_job(const std::shared_ptr<asio_socket> job);
在内部,它所做的只是:
void run_job(const std::shared_ptr<asio_socket> job)
{
boost::asio::io_service io;
boost::asio::ip::tcp::resolver resolver(io);
job->schedule(query_, resolver, io);
io.run();
}
我想添加一个截止日期计时器,它将处理asio:的异步特性
void run_job(const std::shared_ptr<asio_socket> job)
{
boost::asio::io_service io;
boost::asio::ip::tcp::resolver resolver(io);
boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3));
timer.async_wait(boost::bind(&asio_socket::schedule, *job));
// I also have to bind the 3 params: query_, resolver, io
io.run();
}
这样做,我得到template argument deduction/substitution failed:
实际误差为:
‘void (rapp::cloud::asio_socket::*)(boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::query&, boost::asio::ip::tcp::resolver&, boost::asio::io_service&) {aka void (rapp::cloud::asio_socket::*)(boost::asio::ip::basic_resolver_query<boost::asio::ip::tcp>&, boost::asio::ip::basic_resolver<boost::asio::ip::tcp>&, boost::asio::io_service&)}’ is not derived from ‘boost::type<R>’
timer.async_wait(boost::bind(&asio_socket::schedule, *job));
如何绑定(多态)共享指针job
的方法schedule
,同时绑定参数?尝试:
timer.async_wait(boost::bind(&asio_socket::schedule, *job, _1, _2, _3)(&query_, &resolver, &io))
抱怨通过了5个论点,而候选人期望通过2个论点。我的猜测是timer.async_wait
想要将一个方法绑定到一个对象?
- 如何将异步计时器正确绑定到计划操作
- 我需要做嵌套绑定吗?一次用于异步定时器,一次用于计划作业
如果要将引用传递到bind
,则需要将它们作为reference_wapper<>
传递,可以使用boost::ref(x)
或boost::cref(x)
进行传递。
如果不这样做,bind
调用将尝试复制它们,这当然不能用于不可复制的asio
对象。
像这样的东西应该起作用:
timer.async_wait(boost::bind(&asio_socket::schedule,
job, // should bind to a shared_ptr just fine
boost::ref(query_),
boost:;ref(resolver),
boost::ref(io),
boost::placeholders::_1);
时间表需要以下签名:
(boost::asio::ip::tcp::resolver::query &,
boost::asio::ip::tcp::resolver &,
boost::asio::io_service &,
const boost::system::error_code& ec)
因为async_wait要求其处理程序能够接受错误代码参数作为其"第一个"未绑定参数。
这就是为什么必须指定boost::placeholder::_1-将绑定器中的"first"参数(由绑定创建)封送到类的处理程序方法的第四个参数。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 使用单个套接字处理多个传入的 UDP 连接
- Visual Studio(C++):如何使用TCP套接字发送多个值
- Winsock2 select():同一个套接字上可能有多个事件吗?
- C++ 套接字多个请求
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 同一提升 TCP 套接字对象上的多个连接
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 使用 select() 管理多个套接字
- C 创建多个套接字客户端
- IOCP在同一容器中有多个套接字完成端口
- boost::asio::deadline_timer绑定到多态套接字类指针
- WSAEventSelect,一个事件,多个套接字
- Unix 多播套接字线程安全吗?
- 如何在同一程序中创建多个套接字
- 即使在文件描述符不可用的情况下,也能有效地侦听多个套接字
- 以最低的延迟从linux中的多播套接字接收数据
- 如何使多播套接字不接收单播数据?
- 在多线程UDP服务器中使用多个套接字
- 一个线程可以连接多个套接字到相同的ip/端口吗?