【问题标题】:How to create templated nested template Parameter Packs?如何创建模板嵌套模板参数包?
【发布时间】: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&lt;typename T&gt; 而您有一个template&lt;typename T&gt; foo,那么对应的参数是foo,而不是foo&lt;x&gt;foo&lt;y&gt;。除此之外,还不清楚你的程序的其余部分是什么以及它应该做什么。
  • 也许只是template&lt;uint8_t state_id, class... EventAction&gt; class State {};?我的意思是-从您尝试调用它的方式来看-似乎您只需要一个类,而不是类模板。我可能错了 - 但你需要向我们展示你真正想用 EventAction 包做什么才能确定?
  • @PiotrNycz 谢谢!这似乎正是我想要的。它现在正在使用:template&lt; class TObject, uint8_t Event, void (TObject::*Function)(void), uint8_t next_state_id&gt; class EventAction; template&lt;uint8_t state_id, class... EventAction &gt; 和派生类定义作为示例:class S_START : public ::States::State&lt;S_START_ID, ::States::EventAction&lt;SystemTask, E_E_CONFIGURE, &amp;SystemTask::actionConfigure, S_START_ID&gt;&gt;
  • 我能帮上忙真是太好了。我将我们的讨论变成完整的答案 - 请接受它以表明这是您问题的解决方案(对于追随者)。

标签: c++ parameter-pack


【解决方案1】:

在这种情况下,使用类模板的方法很可能过于复杂(过度工程)。

试试类包:

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>>
{};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2019-06-13
    • 1970-01-01
    • 2023-03-22
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多