c++ - 保存模板特化参数的结构

标签 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;

这是正确的做法吗?或者对于这种访问是否有更好的模式?

最佳答案

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

要访问模板中的那些,需要 typename 前缀,例如typename ContainerT::StateT.

typedef enum { S4, S6, S8, ... } StateT 是 C 风格的声明,在 C++ 中做 enum StateT { S4, S6, S8, ... }

关于c++ - 保存模板特化参数的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37831324/

相关文章:

c++ - 为什么以下模板化类成员函数无法编译?

c++ - 模板 C++ 中的迭代器

c++ - OpenCV VideoWriter 花费的时间太长

amazon-web-services - Terraform for 循环

c++ - 用 2x1 榻榻米垫填充 HxW 房间有多少种方法?

c++ - 如何将退出代码从 Ada 进程返回到调用 Windows 进程?

java - 真正的 Java 泛型(模板)

c++ - 错误 : expected unqualified-id before ‘<’ token

c++ - 来自字符串 C++ 的唯一单词集

c++ - 什么时候应该使用 __forceinline 而不是 inline?