2016-06-15 8 views
1

パラメータ。今、私は、それを再利用できるように、それをパラメータテンプレートに何か希望:実際の例では、より具体的なあるので構造体は、私はステートマシンの内部実装、パラメータのセットに動作するものを持っている

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; 

は、このAです行く正しい方法?または、このようなアクセスのためのより良いパターンがありますか?

+0

'ContainerT'の名前を' PolicyT'または 'ContextT'で変更することができます。 – Jarod42

+0

std :: char_traitsは似ています:型の特性(および基本操作)を定義する型および静的メンバー関数のコレクション。 –

+1

あなたは完全なテンプレートソリューションのためにboost meta_state_machineライブラリを見て楽しむかもしれません。 –

答えて

0

これは、テンプレートパラメータを構造体にパックする有効な方法です。

テンプレートからアクセスするには、typenameという接頭辞が必要です。 typename ContainerT::StateT

typedef enum { S4, S6, S8, ... } StateTはCスタイルの宣言であり、C++ do enum StateT { S4, S6, S8, ... }です。

関連する問題