问题描述
我正在尝试基于模板化参数构建一个仅转换动作的状态机,它可以调用另一个给定对象的成员函数。
所以一个单独的状态是一个单一的类。它应该有它的 state-id,还应该被赋予所有可能的事件,以及它到具体状态的具体 Transition-function。
我尝试的是以下内容:
template<uint8_t state_id,template< class TObject,uint8_t Event,void (TObject::*Function)(void),uint8_t next_state_id> class... EventAction >
class State {}
其中第二个模板参数包应根据其具体事件接受多个可能的转换。 (具体处理一个所谓的“EventAction”不是这里的主题) 到目前为止,编译器没有抱怨。
但现在我被困在如何正确调用这个模板上。我需要为参数包模板创建一个具体的类吗? 我想看看它如何使用它会是这样的:
class S_START : public State<S_START_ID,<Object,E_E_GOSEC,actionDoOne,S_SECOND_STATE_ID>,E_E_GOTHIRD,actionDoTwo,S_THIRD_STATE_ID>>
我只能使用 C++11 和 C++14 的一些可能性,但不知何故不能使用全套(TI 的特殊编译器)。
解决方法
在这种情况下,很可能使用类模板的方法过于复杂(过度设计)。
试试类包:
template<uint8_t state_id,class... EventAction>
class State {};
并将其用作
class S_START
: public State<S_START_ID,SomeTemplate<Object,E_E_GOSEC,actionDoOne,S_SECOND_STATE_ID>
SomeTemplate<Object,E_E_GOTHIRD,actionDoTwo,S_THIRD_STATE_ID>>
{};