我的方案是(或多或少)以下内容:
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));
如何绑定(多态)共享指针schedule
的方法job
,并绑定参数?
尝试:
timer.async_wait(boost::bind(&asio_socket::schedule, *job, _1, _2, _3)(&query_, &resolver, &io))
抱怨传递5个参数而候选人需要2个参数。
我的猜测是timer.async_wait
想要将方法绑定到对象?
答案 0 :(得分:1)
如果您想将引用传递到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 :: placeholders :: _ 1 - 将绑定器中的'first'参数(由bind创建)封送到类的处理程序方法的第四个参数。