编辑:我添加了更多细节,我想要一个通用的解决方案,而不是绑定到B类的定义。
在下面的示例中,我尝试将一个类中的函数指针设置为来自另一个类的实例的函数(具有相同的函数指针类型),并且Microsoft C ++告诉我:C++ a pointer to a bound function may only be used to call the function
。
是因为包含回调的对象可能在第一个对象之前被破坏了?我正在将一些Python转换为C ++,这种模式在Python中似乎不是问题。我发现解决方法是使函数(和成员数据)静态化,但是我只是在研究,直到编译器关闭并且代码可以正常工作,而不是我最喜欢的编程方式。
如果不允许这种模式,那么关于在没有静态对象/功能的情况下如何动态地执行此操作的任何建议?
#include <iostream>
#include <string>
typedef void (*callback_function_a)(int);
struct A {
A() {
cbk = nullptr;
};
void print_int(void) {
if (cbk != nullptr) {
cbk(10);
}
}
void set_callback(callback_function_a _cbk) {
cbk = _cbk;
};
callback_function_a cbk;
};
struct B {
B(std::string _header) {
header = _header;
}
void print(int x) {
std::cout << header << x << std::endl;
}
std::string header;
};
void print(int x) {
std::cout << "Non-member func: " << x << std::endl;
}
int
main() {
A classA;
B classB(std::string("MessageFrom classB:"));
/// How do I make both of these work? I want to be able to pass in any
/// function of type callback_function_a?
classA.set_callback(print); // OK
classA.set_callback(classB.print); // <--- error here
}
编辑:我添加了更多细节,我想要一个通用的解决方案,而不是绑定到B类定义的解决方案。在下面的示例中,我尝试在一个类中将一个函数指针设置为一个函数(具有相同的函数...
您的代码有几个问题。
除了Jejo的出色答案外,还可以添加一件事,即,可以使成员函数static
并直接将其作为callback_function_a
传递。示例:
这是std::function
的好用例之一。这是带有给定签名的类型擦除的可调用。