我有一个 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/