c++ - 在不提供参数类型的情况下绑定(bind)函数

标签 c++ function stl bind stdmap

我在 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/

相关文章:

c++ - Qt4/C++/CMake - 没有合适的默认构造函数可用

function - 从 select crate 返回 document::find 的结果时如何分配生命周期?

如果可能,C++ 通过右值引用传递参数,否则复制左值引用

c++ - 在 C++ STL 中访问双端队列元素的最佳方法是什么

c++11 - 为什么我不能将 `new [ ]` 与智能指针一起使用?

c++ - 主要使用过时的类

c++ - 指针和复制构造函数 c++

c++ - 二进制搜索到实数函数的上限

c - 如何将结构传递给函数

c++ - 关于如何使用循环数组实现 std::vector 的建议?