0

问题

假设有一组不同的函数。每个函数都可能是某个对象的成员函数,并且可以采用任意数量的参数。为简单起见,我们假设每个函数的参数不超过 8 个intdoublestd::string类型。例如:

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 显然需要很大的空间来扩展,所以我不想对函数类型做任何假设。

4

1 回答 1

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);
}
于 2012-09-27T21:54:21.893 回答