【发布时间】:2016-05-01 22:57:23
【问题描述】:
我的方案(或多或少)如下:
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。另一个类asio_socket_https 也遵循相同的方案。
asio_socket_http 实现了 asio_async 处理程序,用于 http 连接。
其他类(定义特定的 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 想将方法绑定到对象?
- 如何将异步计时器正确绑定到调度操作?
- 我是否需要进行嵌套绑定,一次用于异步计时器,一次用于计划作业?
【问题讨论】:
标签: c++ sockets boost tcp boost-asio