0

問題

さまざまな関数のセットがあるとします。そこにある各関数は、何らかのオブジェクトのメンバー関数である場合があり、任意の数の引数を取る場合があります。int簡単にするために、各関数には,doubleまたは型の引数が 8 つ以下であると仮定し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);
};

関数に関する一連のレコードを含むファイルがあるとします。各レコードには、呼び出される関数の名前、その引数の値、およびメンバー関数のオブジェクトへのポインターが含まれています。このすべてのデータをファイルから読み取り、正しい引数を使用して正しい順序で関数を実行する方法が必要です。

たとえば、関数の名前をハードコーディングしてもかまいませんが、新しい関数をライブラリに追加するのはできるだけ簡単にする必要があります。

動機

これは、作成しようとしているローグライク ゲーム プロジェクトの一部であり、具体的にはセーブ/ロード ゲーム システムです。プレーヤーがゲームを保存しようとすると、まだ発生していないすべてのイベントも保存する必要があり、次にプレーヤーがゲームをロードするときに、ゲーム イベントを適切にロードしてスケジュールする必要があります。ローグライクは明らかに拡張するために多くのスペースを必要とするため、関数の型については何も仮定したくありません。

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 に答える