我有一个带有状态机的类,并且希望有一个单一的入口点来将事件传递给状态机。该事件伴随着特定于事件的数据,然后我想将其分派给处理程序。所以它看起来像这样......
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 并传递变量参数,它将无法编译,因为所有参数组合都不存在处理程序(例如,没有 eventA() 处理程序接受 eventB() 参数,我不会无论如何都想要)。
我的猜测是有一些优雅的方法可以做到这一点,但它让我望而却步。