【问题标题】:Binding a function without giving parameter types在不提供参数类型的情况下绑定函数
【发布时间】:2026-01-27 16:15:01
【问题描述】:

我在 C++ 中遇到了一些困难的(对我而言)问题。 我做了一些类,比如数字、字符等。 每个类都有一个void add 函数,但数字有void add(int v)、字符-void add(char c) 等。 在 main 函数中,我有 Numbers 和其他类的实例(numbs、charcts),我想将它们与 std::map 绑定,所以我将能够调用这样的函数:

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

这将与以下内容相同:

numbs.add(12);

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

【问题讨论】:

  • 我认为使用不同的语言、JavaScript 或其他东西可能会更快乐。并不是说你不能让它在 C++ 中工作,但你真的在和这门语言作斗争。
  • 你确定这样更容易吗?看起来更难打电话和读给我听...
  • @BitFiddlingCodeMonkey 以后打电话更容易。用户可以键入“数字加 2”,我不必用太多编码来解析用户的输入。
  • 你真的需要动态类型语言。编译器不可能对 func_map["numbers"]["add"] 是一个函数进行类型检查 intfunc_map["numbers"]["someotherfunction"] 是一个函数接受别的东西
  • 你需要像boost::any 这样的东西,并让你的所有成员函数都是以vector<any> 作为参数的函数,并检查它们在运行时是否有效。

标签: c++ function stl bind stdmap


【解决方案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。

【讨论】: