是否可以使用C++函数指针,如 C# 的操作?

Can i use C++ function pointers like a C#'s Action?

本文关键字:操作 指针 可以使 C++ 函数 是否      更新时间:2023-10-16

在C++中,我第一次遇到了函数指针。
我试图使用它来使其类似于 C# 中的操作和委托。
但是,在声明函数指针时,必须指定函数所在的类的类型。
例如( 无效 (A :: * F( ((;
我可以使用可以存储任何类的成员函数的函数指针吗?

通常,函数指针的使用方式如下代码所示。

class A {
public:
    void AF() { cout << "A::F" << endl; }
};
class B {
public:
    void(A::*BF)();
};
int main()
{
    A a;
    B b;
    b.BF = &A::AF;
    (a.*b.BF)();
    return 0;
}

我想像下面的代码一样使用它。
这可能吗?
还是有其他东西可以替换函数指针?

class A {
public:
    void AF() { cout << "A::F" << endl; }
};
class B {
public:
    void(* BF)();
};
int main()
{
    A a;
    B b;
    b.BF = a.AF;
    return 0;
}

我通过答案解决了这个问题。
谢谢!

#include <functional>
#include <iostream>
class A {
public:
    void AF() { std::cout << "A::F" << std::endl; }
};
class C {
public:
    void CF() { std::cout << "C::F" << std::endl; }
};
class B {
public:
    B(){}
    std::function<void()> BF;
};
int main() {
    A a;
    C c;
    B b;
    b.BF = std::bind(&A::AF, &a);
    b.BF();
    b.BF = std::bind(&C::CF, &c);
    b.BF();
    int i;
    std::cin >> i;
    return 0;
}

你想做的可能是这样的。可以使用 std::function 来保存指向绑定到特定实例的成员函数的指针。

#include <functional>
#include <iostream>
class A {
public:
    void AF() { std::cout << "A::F" << std::endl; }
};
class B {
public:
    B(const std::function<void()>& bf) : BF(bf) {}
    std::function<void()> BF;
};
int main() {
    A a;
    B b1(std::bind(&A::AF, &a)); // using std::bind
    B b2([&a] { a.AF(); });      // using a lambda
    b1.BF();
    b2.BF();
    return 0;
}

下面是接受答案的 C# 样式实现,它具有内存效率且灵活,因为您可以在 C# 开发人员可能期望执行的不同执行点构造和委派:

#include <iostream>
#include <functional>
using namespace std;
class A {
public:
    void AF() { cout << "A::F" << endl; }
    void BF() { cout << "B::F" << endl; }
};
class B {
public:
    std::function<void()> Delegate;
};
int main() {
    A a;
    B b;
    b.Delegate = std::bind(&A::AF, &a);
    b.Delegate();
    b.Delegate = [&a] { a.BF(); };
    b.Delegate();
    return 0;
}