如何创建对象函数指针的C ++映射?

时间:2018-10-24 21:29:43

标签: c++ dictionary function-pointers

我正在尝试创建字符串到函数的映射。当它是一个简单的函数时,我已经看到了如何做到这一点:

typedef int (*GetIntFunction)(void);

int get_temp()
{
  return 42;
}

map<string, GetIntFunction> get_integer_map { { "temp", &get_temp } };

auto iter = get_integer_map.find("temp");
int val = (*iter->second()();

但是,我希望函数指针指向特定对象的函数。而且,我知道在创建地图时需要哪个对象。像这样:

class TemperatureModel
{
public:
  int GetTemp();
}

TemperatureModel *tempModel = new TemperatureModel();

map<string, GetIntFunction> get_integer_map { { "temp", &(tempModel->GetTemp} };

如果您想知道为什么要执行此操作,请尝试从输入文件中读取参数列表,从正确的模型中获取它们的值,然后将其值输出到输出文件。我还需要在运行时使用类似的地图来设置值。

1 个答案:

答案 0 :(得分:1)

处理老式类型的最简单方法是编写一个函数:

int call_it() {
    return tempModel->GetTemp();
}

并将该函数存储在问题中的地图中:

map<string, GetIntFunction> get_integer_map {
    { "temp", call_it }
};

一种较新的方法是使用lambda:

map<string, GetIntFunction> get_integer_map {
    { "temp", [=]() { return tempModel->GetTemp(); }
};

另一种方法(如Kamil Cuk的评论中所建议)是使用std::function绑定对象和函数:

map<string, std::function<int()>> get_integer_map {
    { "temp", std::function<int()>(&TemperatureModel::GetTemp, tempModel) }
};

警告:编写但未编译的代码;它可能有错误。