我对C ++中的函数有一些困难(对我来说)问题。
我做了一些课程,比如数字,角色等等。
每个班级都有void add
个功能,但数字有void add(int v)
,字符 - void add(char c)
等。
在main函数中,我有Numbers和其他类的实例(麻木,charcts),我想用std :: map绑定它们,所以我可以调用这样的函数:
func_map["numbers"]["add"](12);
将与:
相同numbs.add(12);
但是对我来说这会更容易,如果我可以通过仅仅将其名称作为字符串来调用方法(如上图所示)。 我该怎么做?
答案 0 :(得分:1)
我会警告你不要这样的设计。
但是,如果你绝对需要,你必须为你的功能定义一个通用接口。也就是说,您的函数必须具有相同的原型。
例如,您可以定义一些可以从不同数据类型构造的容器类(或使用类似boost :: variant的东西),并且可以编写“添加”函数,以便它们接受此类的对象。我的意思是:
class DataContainer {
public:
DataContainer(int n) { int_data_ = n; }
DataContainer(char c) { int_data_ = c; }
DataContainer(const string s) { string_data_ = s; }
// let them be public to make code shorter
int int_data_;
string string_data_;
};
typedef void (*OpMethod)(const DataContainer);
void NumberAdd(const DataContainer data) {
// work with data.int_data_
}
map<string, map<string, OpMethod> > funcmap;
...
funcmap["number"]["add"] = NumberAdd;
绑定类方法会有点困难(您还应该指定一个对象实例)。考虑使用std :: function。