boost :: bind向回调函数

时间:2017-09-06 14:02:10

标签: c++ boost callback

我正在编写一个异步函数,它接受一个回调fn,在完成后调用。一般来说,这工作正常(但有一些限制),我能够发送如下的参数。

#include <boost/bind.hpp>
#include <iostream>

void foo_cb(int result, const char* data) {
  std::cout << "foo_cb executed with params " << result << ", " << data << std::endl;
}


//void foo_caller(std::function<void(int, const char*)> ff) {
//template <typename... Args>
void foo_caller(std::function<void(int, const char*)> ff) {
  std::cout << "Caller executing..." << std::endl;
  ff(1, "hi");
}

int main(int argc, char** argv) {
  int x = 122;
  const char* y = "Hello nether world";
  foo_caller(boost::bind(foo_cb, x, y));
  return 0;
}

我有两个问题:

  1. 在foo_caller()函数内部,在调用回调ff时,我必须给出一些虚拟值来满足被调用fn的函数签名,即ff(1,“hi”);但这会正确执行并打印main()中传递的原始值。不得不使用一些值调用ff()看起来非常不自然。

  2. 在我的main()中,我可能决定将不同类型和/或数量的参数传递给回调函数,并相应地编写完成处理程序。在这种情况下,我如何实际编写异步函数foo_caller(...)来获取可变数量的args和数据类型并正确调用完成处理程序?

  3. 更新

    感谢Jonesinator,在看了std :: placeholders之后,我意识到我在做什么错误。

    1. foo_caller签名n定义错误。
    2. 从main调用也是错误的。
    3. 有效代码的更新版本如下:

      void foo_cb(int result, const char* data) {
        std::cout << "foo_cb executed with params " << result << ", " << data << std::endl;
      }
      
      
      void foo_caller(std::function<void(int, const char*)> ff, int a, const char* b) {
        std::cout << "Caller executing..." << std::endl;
        ff(a, b);
      }
      
      
      int main(int argc, char** argv) {
      
        int x = 122;
        const char* y = "Hello nether world";
        foo_caller(std::bind(foo_cb, std::placeholders::_1, std::placeholders::_2), x, y);
        return 0;
      }
      

2 个答案:

答案 0 :(得分:3)

由于您使用的是std::function,因此您可能也应该使用std::bind。对于在std::bind创建时未绑定的参数,std::function函数可以使用placeholder arguments

答案 1 :(得分:0)

对于您的第一个问题:由于您将参数绑定到函数,foo_caller的签名应该是:

void foo_caller(std::function<void()> ff)

boost :: bind复制你传递的参数并创建一个新的可调用实体,该实体可以不带参数调用(因为它们被这个新实体所知)并返回void。

如果你想稍后传递参数,你必须像Jonesinator在答案中解释的那样绑定占位符。