gpt4 book ai didi

c++ - 如何将可变成员函数绑定(bind)到仿函数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:21 25 4
gpt4 key购买 nike

我正在尝试使用 std::bind 绑定(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");
}
}

当我编译时,我收到一条错误消息,指出“没有匹配的调用...”,其中 ... 是绑定(bind)调用的填充模板类型。如果我将 call_var_callback() 的定义移到“测试”对象的范围之外,一切正常。但是,在我的真实代码库中,我需要绑定(bind)函数成为类的成员,因为它带有状态。

预先感谢您的考虑和帮助。

最佳答案

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

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

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

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

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

关于c++ - 如何将可变成员函数绑定(bind)到仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com