c++ - 我可以简化这个吗?

标签 c++ reference polymorphism function-pointers

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/

相关文章:

c++ - 使用 Parent 构造函数初始化子类

java - 从基类请求主体 DTO 获取派生 DTO

c++ - 捕获标准输出到 zip 并使用 CTRL-C 中断会产生损坏的 zip 文件

c++ - 为什么这行得通?不合逻辑的数组访问

c++ - 如何使用模板类保持代码整洁?

c++ - 当请求的键丢失时,有没有办法从 vector 映射中返回 std::vector ref?

list - 为什么haskell没有异构列表

c++ - 从 Qt 中的类调用槽

php - 为什么按值分配给数组元素的变量(在较早的按引用分配之后)会在数组元素更改时更改?

Python 子进程引用导致 fd 耗尽