2016-05-16 4 views
1

異なる種類のメッセージに対して異なるハンドラを使用する場合、各メッセージはintで識別されます。私は各ハンドラをテンプレートメソッドのインスタンス化として定義したいと思います。 MESSAGE1がタイプではないので、このコードはコンパイルされません。もちろん、テンプレートハンドラのメソッド

handlers.h

enum Handler { 
    MESSAGE1, 
    MESSAGE2 
}; 

template<MESSAGE1> 
void handle() { 
} 

main.cppに

int main() 
{ 
    handle<Handler::MESSAGE>(); 
} 

アイデアは、このようなものです。 メッセージごとに異なるタイプを作成するにはどうすればよいですか?また、これらの型の使用を可能な限り意味のあるものとして維持したいと考えています(enumの使用)。

答えて

5

あなたはテンプレートの特殊非型テンプレートパラメータと呼ばれているものとしますあなたの列挙型をラップするstd::integral_constantを使用(または同じことを行うには、独自の空のタイプのラッパーを記述)することができます

template<Handlers H> void handle(); // default 

template<> void handle<MESSAGE1>() { 
    // ... 
} 

template<> void handle<MESSAGE2>() { 
    // ... 
} 
2

template <Handler H> 
using handle_t = std::integral_constant<Handler, H>; 

そして、異なる種類の過負荷:

種類に
void handle(handle_t<MESSAGE1>) { ... } 
void handle(handle_t<MESSAGE2>) { ... } 
あなたが経由で呼び出すことができます

handle(handle_t<MESSAGE1>{}); 
関連する問題