首页 > 解决方案 > 有没有办法在集合中引用类的方法?

问题描述

我个人希望这适用于 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——该解决方案似乎不适用于我。

标签: c++qtmethodsfunction-pointersclass-members

解决方案


您可以将函数指针用于常规函数或静态类方法:

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();
}

推荐阅读