如何调用 class 方法,returns 是 class 方法指针?

How do I call a class method that returns a class method pointer?

这编译正常,但给我一个链接器错误 "undefined reference to A::a(std::string const&)"

如何在我的 doSomething() 方法中正确调用 A::a(const std::string& name) 以及如何正确调用 funcTable.second()?

.h 文件:

class A {
    void (A::*a(const std::string& name))() const;
    void func1() const;
    void func2() const;
    void doSomething();
};

.cpp 文件:

void (A::*a(const std::string& name))() const {
    const std::map<const std::string, void (A::*)() const> funcMap = {
        {"name1", &A::func1},
        {"name2", &A::func2}
    };
    return funcMap.at(name);
}
void A::func1() const {
    // call func1
}
void A::func2() const {
    // call func2
}
void A::doSomething() {
    std::pair<std::string, void (A::*)() const> funcTable;
    funcTable.first = "func1";
    funcTable.second = a("name1");    // This is my problem
    // Not even sure how to then call funcTable.second()
}

我意识到 typedef 会使它更清晰。我试过这种方法,但我也不知道该怎么做。

void (A::*a(const std::string& name))() const {

这不是定义您的 class 方法。这是在全局命名空间中定义一个独立函数,其中 returns 一个 class 方法指针。你想要的是:

void (A::*A::a(const std::string& name))() const {

这定义了一个 class 方法,该方法 returns 指向 class 成员的指针。满嘴的。

I realize a typedef would make this a lot cleaner.

是的,会的。非常鼓励使用 typedef。使保持更多的剩余理智成为可能。这总是一件好事。

P.S。 -- 如果您实际上尝试编译您在问题中显示的确切代码,它不会 "compile fine",尽管您另有声明。您会收到以下编译错误,它提供了关于正在发生的事情的重要线索:

t.C: In function ‘void (A::* a(const string&))() const’:
t.C:13:23: error: ‘void A::func1() const’ is private within this context
         {"name1", &A::func1},

嗯?为什么 class 方法无法引用另一个私有 class 方法?哦!

作为替代方案,我建议不要使用那种丑陋的语法,而是使用尾随 return 类型:

auto A::a(const std::string& name) -> void (A::*)() const { /* implementation */ }

funcTable.second = a("name1"); // This is my problem
// Not even sure how to then call funcTable.second()

它会是这样的:

(instance.*funcTable.second)();

(this->*funcTable.second)();