c++ - 有没有办法在集合中引用类的方法?
问题描述
我个人希望这适用于 Qt,所以如果代码关闭,请随时修复它。
我想要的是创建一个可以引用类成员的集合。我尝试了函数指针,但我得到错误我不能使用非静态成员或类似的东西。我试过&ClassName::memberName
了,但这给了我一些关于它必须是常数或其他东西的错误。
我不确定要提供什么样的代码,因为我试图询问 C++ 中是否有可能。
语境
因为人们可能会问我为什么要这样做,所以我计划在我的软件中为各种“工具”提供一长串方法。每个工具都与 4 个鼠标事件相关联:1 个用于移动、释放、按下、双击。
我想保持效率,所以我希望做类似的事情
enum class MouseAction { MOVE=-1, RELEASE, PRESS, DOUBLECLICK }
void mousePressed(MouseEvent *e) {mouseActionMethod[toolName][MouseAction::PRESS](e);}
为此,我需要一个map<Action, map<MouseAction, void*>>
将类成员插入到void*
as 函数指针中的集合。但是,这样做会导致错误。
如前所述,尝试以几种方式执行此操作,结果令人困惑。如果我在浪费任何额外的努力之前发现这是不可能的,那就更好了。
我还根据我在堆栈溢出中发现的另一个问题替换了void*
with (ClassName*)
to try &ClassName::methodName
——该解决方案似乎不适用于我。
解决方案
您可以将函数指针用于常规函数或静态类方法:
void foo(int) {/**/}
struct S
{
static void bar(int) {/**/}
};
// and then
main()
{
void (*f1)(int) = &foo;
void (*f2)(int) = &S::bar;
f1(42); // calls foo(42)
f2(42); // calls S::bar(42)
}
方法指针可用于非静态类方法
struct S
{
void bar(int) {/**/}
};
// and then
main()
{
void (S::*m)(int) = &S::bar;
S s;
(s.*m)(42); // call s.bar(42);
}
std::function
是另一种选择:
struct S
{
void bar(int) {/**/}
};
// and then
main()
{
std::function<void (S*, int)> f1 = &S::bar;
S s;
std::function<void (int)> f2 = [&s](int i) { s.bar(i); }
std::function<void ()> f3 = [&s]() { s.bar(43); }
f1(&s, 42);
f2(42);
f3();
}
推荐阅读
- node.js - 使用 HSET 将 JSON 数据循环到 Redis
- javascript - 附加的项目被立即删除
- amazon-web-services - 从 VPC 访问 S3 存储桶
- javascript - JavaScript 数组视图
- php - 如何不显示重复的文本?
- python - 地图数据框列
- css - CSS 网格问题
- wordpress - Visual Studio Code + WordPress + Docker:VS Code Not Sourcing Apache envvars 文件
- arrays - 使用对象中使用的数组计算总和
- c# - 在 ml.net 上制作预测引擎时在同一行上转换数据