问题
假设有一组不同的功能。这些函数中的每一个可以是某个对象的成员函数,并且可以采用任意数量的参数。为简单起见,我们假设每个函数的int
,double
或std::string
类型的参数不超过8个。例如:
class MyClass{
public:
void DoA(int i);
void DoB(double d, int i);
};
class YourClass{
public:
void DoC(std::string s);
void DoD(int i1, int i2, int i3);
};
让我们假设有一个文件包含一系列有关函数的记录。每条记录包含要调用的函数的名称,其参数值和指向成员函数的对象的指针。我需要一种方法从文件中读取所有这些数据,并使用正确的参数以正确的顺序执行函数。
例如,可以将函数的名称硬编码,但是向库中添加新函数应该尽可能简单。
动机
这是我正在尝试创建的roguelike游戏项目的一部分,特别是一个保存/加载游戏系统。一旦玩家试图保存他的游戏,所有尚未发生的事件也必须保存,下次玩家加载游戏时,应该正确加载和安排事件。由于roguelike显然需要很大的扩展空间,我不想对函数类型做任何假设。
答案 0 :(得分:1)
这是一个想法:
class Foo
{
void f1_impl(double, char, int);
void f2_impl(int, int);
void func1(std::string s)
{
double d;
char c;
int i;
std::tie(d, c, i) = parse<double, char, int>(std::move(s));
f1_impl(d, c, i);
}
void func2(std::string s)
{
// similarly
}
};
std::unordered_map<std::string, void (Foo::*)(std::string)> const functions
{ { "function1", &Foo::func1 },
{ "function2", &Foo::func2 },
};
输入文件:
function1 1.250000,'a',2815
function2 12,-80
function2 99,111
解析:
Foo x;
for (std::string line; std::getline(inputfile, line); )
{
std::string f, a;
if (!(std::istringstream(line) >> f >> a)) { /* error */ }
(x.*functions[f])(a);
}