我发现很多帖子都非常清楚地说明派生类函数不能被分配给基类函数指针。所以我想知道如何处理和解决以下情况:
假设我有以下基类
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/