C++ - 替代基类函数指针调用

标签 c++ inheritance function-pointers associative-array pointer-to-member

我发现很多帖子都非常清楚地说明派生类函数不能被分配给基类函数指针。所以我想知道如何处理和解决以下情况:

假设我有以下基

class base {
protected:
    typedef void (base::*base_fp)();
    typedef std::map<std::string, base_fp> array;

    array associativeArray;    
};

这个类的主要目的是拥有一个“associative-array of functions”属性。

所以我想要的是每个派生的 child 都能够将他们的方法添加到“associativeArray”

this->associativeArray["Method"] = &child::method; // from the child class

我使用它的初衷是在不使用条件语句的情况下根据需要调用不同的方法。它会在 try-catch block 中处理不存在索引的情况。由于我原来的方法是不可能的,那么这样做的正确方法是什么?

编辑:一个用例示例

假设关联数组是“算法”函数 的数组。 然后对于用户“算法”输入,我应该可以调用子类中定义的相应方法

(this->*associativeArray.at("algorithm"))();

最佳答案

我最接近您想要的是使用 std::function(自 C++11 起可用)。首先,我们将更改您的 typedef,以实现现代化和使用 std::function:

class base {
protected:
    using base_fp = std::function<void ()>;
    using fn_array = std::map<std::string, base_fp>;
    fn_array fns;

public:
    void call_fn(std::string const &fn_name) {
        auto it = fns.find(fn_name);
        if(it != fns.end()) {
            it->second();
        }
        else {
            // error case
        }
    }
};

因为 fn_array 存储 std::function,所以它可以处理任何我们可以视为可调用的东西。这不能直接与成员函数一起使用(std::invoke 可能会起作用,但我没有使用该库功能),但您可以使用简单的闭包来获得类似的行为。

class derived : public base {
public:
    derived() {
        fns["foo"] = [this]() { foo(); };
    }

private:
    void foo() {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

您可以使用如下代码来利用它:

int main() {
    derived d;
    d.call_fn("foo");
    return 0;
}

关于C++ - 替代基类函数指针调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50195383/

相关文章:

c++ - 继承在 child 中初始化的数组

perl - Perl 中引用子类包名

c - 实现 FSM 真的需要函数指针吗?

c++ - 函数指针 - 无法更改函数签名,我有什么选择?

c++ - 创建具有多个继承输入类型的泛型类

c++ - 将类函数指针转换为 void* 或反之

c++ - 使用默认值在 header 中定义静态整数

c++ - 为什么这段代码会崩溃

c++ - 如何在具有任意名称的函数中定义类范围变量?

c++ - 从包含特定字符串的行开始读取