我在 C++ 函数方面遇到了一些(对我来说)困难的问题。
我做了一些类(class),比如数字、字符等等。
每个类都有一个void add
函数,但是Numbers有void add(int v)
,Characters - void add(char c)
等。
在主函数中,我有 Numbers 和其他类的实例(numbs、charcts),我想将它们与 std::map 绑定(bind),这样我就可以调用这样的函数:
func_map["numbers"]["add"](12);
这将与:
numbs.add(12);
但如果我可以通过仅将名称作为字符串来调用方法(如上所示),对我来说会更容易。 我应该怎么做?
最佳答案
我会警告你不要这样的设计。
但是,好吧,如果您绝对需要它,则必须为您的函数定义一个通用接口(interface)。也就是说,您的函数必须具有相同的原型(prototype)。
例如,您可以定义一些可以从不同数据类型构造的容器类(或使用类似 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;
绑定(bind)类方法会有点困难(您还应该指定一个对象实例)。考虑使用 std::function。
关于c++ - 在不提供参数类型的情况下绑定(bind)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275409/