如何解决不能将函数指针分配给另一个任意类的变量
我想创建一个库,其中的一部分允许将回调函数绑定到某个事件。库类有一个由外部调用者调用的普通函数。该函数可以触发一个或多个事件,调用者应该使用他可能已在库类中注册的回调来通知这些事件。
为了实现该功能,我想使用函数指针。但是编译器一直在抱怨类型。
#include <iostream>
#include <functional>
using std::cout;
using std::endl;
bool checkGT5(int a);
class A
{
private:
std::function<bool(int)> f = nullptr;
public:
void setF(std::function<bool(int)> f) { this->f = f; }
bool call(int a) { if (f) { return f(a); } return false; }
};
bool checkGT5(int a)
{
return a > 5;
}
class B
{
private:
bool checkGT7(int a) { return a > 7; }
A a;
public:
void doStuff()
{
// error: cannot convert 'bool (B::*)(int)' to 'std::function<bool(int)>'
a.setF(&B::checkGT7);
cout << a.call(9) << endl;
}
};
int main()
{
// OK
cout << checkGT5(7) << endl;
// OK
A a;
a.setF(&checkGT5);
cout << a.call(7) << endl;
// error: cannot convert 'bool (B::*)(int)' to 'std::function<bool(int)>'
// would fail even if function was public
a.setF(&B::checkGT7)
return 0;
}
同样的情况发生在像 bool (*g)(int)
这样的“普通”函数指针上。我可以很好地分配一个值。我也可以声明它 bool (*B::g)(int)
并从 B 类分配一个函数。但我不想硬编码只有 B 类可以分配一个函数。任何课程都应该可以。
我该怎么做?
我试过强制转换为 void*,但它说它不能转换,无论是使用静态类型转换还是 c 风格转换。这样做的正确方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。