ステート マシンを持つクラスがあり、イベントをステート マシンに渡す単一のエントリ ポイントが必要です。イベントにはイベント固有のデータが付随しており、これをハンドラーにディスパッチしたいと考えています。だから、それはこのようなものに見えます...
class X
{
public:
...
template<typename... A> void fsm(eEvent eventId, const A&... eventData);
private:
...
void eventA(int a, double b);
void eventB(std::string a);
void eventC(unsigned long a);
};
...このような呼び出しで...
X x;
x.fsm(eEventA, -1, 2.0);
x.fsm(eEventB, "xyz");
x.fsm(eEventC, 42);
テンプレート関数を取得して正しいハンドラーを呼び出す方法がわかりません。単純に eventId をオンにして可変引数を渡すと、すべてのパラメーターの組み合わせに対してハンドラーが存在しないため、コンパイルされません (たとえば、eventB() 引数を受け入れる eventA() ハンドラーはありません)。とにかく欲しい)。
これを行うためのエレガントな方法があると思いますが、それは私を避けています。