【发布时间】:2021-04-01 03:30:24
【问题描述】:
我正在尝试基于模板参数构建一个仅转换动作的状态机,它可以调用另一个给定对象的成员函数。
所以一个单独的 State 是一个单独的类。它应该有它的 state-id,并且应该给它所有可能的事件及其具体的转换函数到具体的状态。
我尝试的是以下内容:
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>
, <Object, E_E_GOTHIRD, actionDoTwo, S_THIRD_STATE_ID>>
我是在搞砸什么,还是我的方法从一开始就错了?
我只能使用 C++11 和 C++14 的一些可能性,但不知何故不能使用全套(TI 的特殊编译器)。
【问题讨论】:
-
必须将本身就是模板的模板参数...指定为模板,而不是模板的特定实例。也就是说,如果您的模板参数是
template<typename T>而您有一个template<typename T> foo,那么对应的参数是foo,而不是foo<x>或foo<y>。除此之外,还不清楚你的程序的其余部分是什么以及它应该做什么。 -
也许只是
template<uint8_t state_id, class... EventAction> class State {};?我的意思是-从您尝试调用它的方式来看-似乎您只需要一个类,而不是类模板。我可能错了 - 但你需要向我们展示你真正想用 EventAction 包做什么才能确定? -
@PiotrNycz 谢谢!这似乎正是我想要的。它现在正在使用:
template< class TObject, uint8_t Event, void (TObject::*Function)(void), uint8_t next_state_id> class EventAction; template<uint8_t state_id, class... EventAction >和派生类定义作为示例:class S_START : public ::States::State<S_START_ID, ::States::EventAction<SystemTask, E_E_CONFIGURE, &SystemTask::actionConfigure, S_START_ID>> -
我能帮上忙真是太好了。我将我们的讨论变成完整的答案 - 请接受它以表明这是您问题的解决方案(对于追随者)。
标签: c++ parameter-pack