我尝试绑定boost :: asio参数。绑定的函数是结构的静态成员:
template <typename T>
struct bind_struct{
typedef boost::system::error_code error_code;
typedef boost::asio::ip::tcp::acceptor tcp_acceptor_type;
typedef std::shared_ptr<boost::asio::ip::tcp::socket> socket_type;
static void tcp_on_async_accept(error_code& er,
tcp_acceptor_type* acc,
socket_type socket){
std::cout << "ok" << std::endl;
}
static void good_function(int m){
std::cout << m << std::endl;
}
};
绑定操作:
/*Error*/
bind_struct<void>::socket_type sock;
bind_struct<void>::tcp_acceptor_type* acc;
auto fn = boost::bind(bind_struct<void>::tcp_on_async_accept,
boost::asio::placeholders::error,
acc, sock);
fn();
/*Ok*/
auto fn1 = boost::bind(bind_struct<void>::good_function,_1);
fn1(10);
这里有什么问题? Errors.
答案 0 :(得分:2)
fn()
失败,因为仿函数期望传递给它的第一个参数能够绑定到boost::system::error_code&
。
boost::asio::placeholders::error
州的Boost.Asio文档:
与
boost::bind()
一起使用的参数占位符,对应于任何异步函数的处理程序的错误参数。
因此,当功能:
void bind_struct::tcp_on_async_accept(
boost::system::error_code&,
boost::asio::ip::tcp::acceptor*,
std::shared_ptr<boost::asio::ip::tcp::socket>)
与...绑定:
boost::asio::ip::tcp::acceptor* acceptor;
std::shared_ptr<boost::asio::ip::tcp::socket> socket;
auto fn = boost::bind(
bind_struct<void>::tcp_on_async_accept,
boost::asio::placeholders::error, // _1
acceptor, socket);
只有在传递给调用的第一个参数绑定到fn
时,才能调用生成的仿函数boost::system::error_code&
。因此,以下内容将失败:
fn();
以下内容将起作用:
boost::system::error_code error;
fn(error);
请考虑阅读this博客,了解bind()
。
如果将bind_struct::tcp_on_async_accept()
用作async_accept()
操作的处理程序,则考虑通过值或const引用更改第一个参数类型以接受error_code
。 Asynchronous Operations类型要求指定处理程序的第一个参数是boost::system::error_code
类型的左值,AcceptHandler文档说明h
是否为处理程序ec
是一个const error_code
,那么表达式h(ec)
必须是有效的。由于const error_code
无法绑定到boost::system::error_code&
,bind_struct::tcp_on_async_accept()
无法满足AcceptHandler类型要求。