C++ - 基类函数指针调用的替代方法
C++ - Alternative to base-class function-pointer calls
我发现很多帖子都非常清楚地指出派生类函数不能分配给基类函数指针。所以我想知道,如何处理和解决以下情况:
假设我有以下基本class
class base {
protected:
typedef void (base::*base_fp)();
typedef std::map<std::string, base_fp> array;
array associativeArray;
};
这个类的主要目的是有一个"functions
"性质的associative-array
。
所以我想要的是每个派生的孩子都能够将他们的方法添加到"关联数组"中。
this->associativeArray["Method"] = &child::method; // from the child class
我使用它的初衷是根据需要调用不同的方法,而不使用条件语句。它将在一个 try-catch 块中处理不存在的索引的情况。既然我原来的方法是不可能的,那么正确的方法是什么呢?
编辑:用例示例
假设关联数组是"算法"functions
数组。 那么对于用户的"算法"输入,我应该能够调用子类中定义的相应方法
(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;
}
我想你需要的是static_cast
,因为在具有相同签名的两个函数之间使用是安全的,即使是从同一类层次结构生成的。
class base {
protected:
typedef void (base::*fn)() ;
base(){
fn_arr["foo"]=&base::foo;
}
void foo() {
cout << "i'm foo" << endl;
}
public:
map<std::string, fn> fn_arr;
};
class derived : public base {
protected:
void bar() {
cout <<"i'm bar" << endl;
}
public:
derived() {
fn_arr["bar"]=static_cast<fn>(&derived::bar);
}
};
查看此演示
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用