是否可以使用C++函数指针,如 C# 的操作?
Can i use C++ function pointers like a C#'s Action?
在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;
}
相关文章:
- 迭代器的指针操作问题
- 我试图了解在异或操作后指针变量正在更改
- 通过浮点指针操作字节向量
- 使用 XOR 操作仅使用 2 个指针反转链表
- 为什么指针在由后增量比较器操作时行为不同?
- 指针 OOP 操作
- C++数组指针上的删除操作
- 如何有效地使用 std::async 对指针数组执行操作
- 为什么在执行增量操作之前分配指针值
- 是否可以使用C++函数指针,如 C# 的操作?
- 共享指针,C 版本的原子操作
- 普通指针,连同通常的操作 & 和 *,是 monad 吗?
- 双指针 **src 和操作 (*(*src)++ = reg_offset)
- 调用向量内的函数指针不执行任何操作
- 调用 vector.erase() 函数时指针操作无效错误
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- C 弦乐操作用指针,中间为空
- 尝试仅通过操作指针对链表进行排序
- 在类内部操作指针
- 仅通过操作指针交换链表中的相邻节点