用于保存模板特化参数的结构

时间:2016-06-15 09:23:57

标签: c++ templates

我有一个StateMachine的内部实现,它可以处理一组参数:

struct StateMachine {
  enum State { S1, S2, S3 };
  enum Events { E1, E2, E3 };

  State current_state_;
  Data data_;
  State Process(Events event);
};

哪个效果很好。现在,我想模板参数化它以便可以重复使用,例如:

template<typename StateT, typename EventT, typename DataT>
struct StateMachine {
  StateT current_state_;
  DataT data_;
  StateT Process(EventT event);
};

因为实际的例子更具体,我最终有很多模板参数。我想要的是能够通过定义这些模板特化的1个具体子结构,所以:

template<typename ContainerT>
struct StateMachine {
  ContainerT::StateT current_state_;
  ContainerT::DataT data_;
  ContainerT::StateT Process(ContainerT::EventT event);
};

然后我可以在我的项目中定义多个容器:

struct SM1 {
  typedef enum { S4, S6, S8, ... } StateT;
  typedef enum { E4, E8, E16, ... } EnumT;
  typedef SM1 DataT;

  string payload_data;
};
StateMachine<SM1> sm1;

struct SM2 {
  typedef enum { S3, S6, S9, ... } StateT;
  typedef enum { E3, E6, E9, ... } EnumT;
  typedef SM2 DataT;

  uint32 payload;
};
StateMachine<SM2> sm1;

这是一个正确的方法吗?或者这种访问是否有更好的模式?

1 个答案:

答案 0 :(得分:0)

是的,这是将模板参数打包到结构中的有效方法。

要访问模板typename前缀,需要使用前缀,例如typename ContainerT::StateT

typedef enum { S4, S6, S8, ... } StateT是一个C风格的声明,用C ++做enum StateT { S4, S6, S8, ... }