typedef void (FunctionSet::* Function)();

class MyFunctionSet : public FunctionSet
{
protected:
    void addFunctions()
    {
        addFunction(Function(&MyFunctionSet::function1));
    }

    void function1()
    {
        // Do something.
    }
};

addFunction方法将函数添加到基类的列表中,
然后可以枚举调用所有函数。

有什么方法可以简化(减少打字工作)增加功能吗?

最佳答案

看起来您将指向派生类的函数的成员函数指针分配给了指向基类的函数的成员函数指针。好吧,那是被禁止的,因为它在类型系统中开了一个洞。令人惊讶(至少对我来说,这是我第一次听到)。阅读this answer以了解原因。

要回答您的实际问题-我将addFunction用作模板:

void addFunctions() {
    addFunction(&MyFunctionSet::function1);
}

将基类中的addFunction更改为此:
template<typename Derived>
void addFunction(void(Derived::*f)()) {
    myFunctions.push_back(static_cast<Function>(f));
}

最好使用static_cast,因为它会告诉您Derived是否实际上不是从FunctionSet派生的。

关于c++ - 我可以简化一下吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/459649/

10-09 06:36
查看更多