C++ C++;任意函数反序列化

C++ C++;任意函数反序列化,c++,function,templates,io,deserialization,C++,Function,Templates,Io,Deserialization,问题 假设有一组不同的函数。这些函数中的每一个都可以是某个对象的成员函数,并且可以采用任意数量的参数。为了简单起见,让我们假设每个函数的参数不超过8个,分别为int、double或std::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

问题

假设有一组不同的函数。这些函数中的每一个都可以是某个对象的成员函数,并且可以采用任意数量的参数。为了简单起见,让我们假设每个函数的参数不超过8个,分别为
int
double
std::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 is显然需要很大的扩展空间,我不想对函数类型做任何假设。

这里有一个想法:

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 },
};
解析:

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);
}

为什么不使用序列化库呢???因为你没有问这个问题,所以很难回答。无论如何,这个设计很糟糕;使用嵌入式脚本语言(我不提倡Lua,一点也不提倡),忘记这个可怕的概念。或者合并到Gamedev SE,然后我会回答你。问题是如何实现这样的事情@VladLazarenko我不知道任何这样的库,到目前为止,我尝试用XML记录保存。有关通用序列化库,请参阅。但我不确定“序列化函数”是什么意思。多重签名很难。最好允许每个函数使用一个参数,即一个字符串,然后让该函数进行解析。这对我来说仍然很难使用。@Saage:注意,您可以将
func1
等作为通用模板,如
func\u wrap(std::string)
等,因为内容总是相同的。