微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能将函数指针分配给另一个任意类的变量

如何解决不能将函数指针分配给另一个任意类的变量

我想创建一个库,其中的一部分允许将回调函数绑定到某个事件。库类有一个由外部调用调用的普通函数。该函数可以触发一个或多个事件,调用者应该使用他可能已在库类中注册的回调来通知这些事件。

为了实现该功能,我想使用函数指针。但是编译器一直在抱怨类型。

#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 举报,一经查实,本站将立刻删除。