如何将变元成员函数绑定到函子

How can you bind a variadic member function to a functor?

本文关键字:绑定 函数 成员      更新时间:2023-10-16

我正试图使用std::bind绑定变差函数的第一个参数,然后将返回的函子传递给boost::signals2::signal的connect((函数。只要变差函数不是成员函数,该过程就可以正常工作。这就是我希望能够做到的:

class test {
public:
  test() {}
  void call_var_callback(string const& func, ...) { 
    va_list args;
    va_start(args, func);
    std::cout << "Calling variadic function: " << func << std::endl;
  }
};
test t;
void register_callback2(std::map<string, boost::any>& sig_table,
                        string func, string event) {
  auto event_entry = sig_table.find(event);
  if (event_entry != sig_table.end()) {
    if (event == "event1") {
      auto sig = boost::any_cast<signal<void (void)>*>(sig_table["event1"]);
      sig->connect(std::bind(&test::call_var_callback, &t, std::cref(func)));
      //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    }
  } else {
    std::cout << "No such event exists!" << std::endl;
  }
}
int main( void ) {
  // define events
  signal<void (void)> event1;
  signal<void (char const*)> event2;
  signal<void (int, char const*)> event3;
  // intialize event / signal lookup table
  std::map<string, boost::any> sig_tbl;
  sig_tbl["event1"] = &event1;
  sig_tbl["event2"] = &event2;
  sig_tbl["event3"] = &event3;
  // connect the signals
  register_callback2(sig_tbl, "func1", "event1");
  register_callback2(sig_tbl, "func2", "event2");
  register_callback2(sig_tbl, "func3", "event3");
  // call the signals
  for (int i = 1000; i > 0; --i) {
    (*boost::any_cast<signal<void (void)>*>(sig_tbl["event1"]))();
    (*boost::any_cast<signal<void (char const*)>*>(sig_tbl["event2"]))("0xBAAD");
    (*boost::any_cast<signal<void (int, char const*)>*>(sig_tbl["event3"]))(5, "0xBEEF");
  }
}

当我编译时,我得到一个错误,指出"对…的调用不匹配"哪里。。。是要绑定的调用的已填充模板类型。如果我将call_var_callback((的定义移动到"test"对象的范围之外,那么一切都可以。然而,在我的实际代码库中,我需要绑定函数成为类的成员,因为它携带状态

提前感谢您的考虑和帮助。

绑定成员函数时,不获取对象的地址。在您的代码中:

sig->connect(std::bind(&test::call_var_callback, &t, std::cref(func)));

&t是错误的,它应该是一个普通的t

bind支持两种主要的对象绑定方式:您可以

  • 传递对象本身或
  • 指向对象的指针(以及共享指针而非原始指针(