在C ++中,我首先遇到函数指针。
我试图用它来使其类似于C#中的“动作和委托”。
但是,在声明函数指针时,必须指定该函数所在的类的类型。
例如)void(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;
}
答案 0 :(得分:3)
您想要做的可能是这样的。您可以使用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;
}
答案 1 :(得分:1)
这是公认答案的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;
}