boost :: bind静态函数的参数

时间:2014-01-14 04:48:51

标签: c++ boost boost-asio boost-bind

我尝试绑定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.

1 个答案:

答案 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_codeAsynchronous 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类型要求。