我有一个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;
这是一个正确的方法吗?或者这种访问是否有更好的模式?
答案 0 :(得分:0)
是的,这是将模板参数打包到结构中的有效方法。
要访问模板typename
前缀,需要使用前缀,例如typename ContainerT::StateT
。
typedef enum { S4, S6, S8, ... } StateT
是一个C风格的声明,用C ++做enum StateT { S4, S6, S8, ... }
。