在不提供参数类型的情况下绑定函数

时间:2013-11-28 22:06:34

标签: c++ function stl bind stdmap

我对C ++中的函数有一些困难(对我来说)问题。 我做了一些课程,比如数字,角色等等。 每个班级都有void add个功能,但数字有void add(int v),字符 - void add(char c)等。 在main函数中,我有Numbers和其他类的实例(麻木,charcts),我想用std :: map绑定它们,所以我可以调用这样的函数:

func_map["numbers"]["add"](12);

将与:

相同
numbs.add(12);

但是对我来说这会更容易,如果我可以通过仅仅将其名称作为字符串来调用方法(如上图所示)。 我该怎么做?

1 个答案:

答案 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。