2016-05-16 74 views
1

假设我想针对不同类型的消息拥有不同的处理程序,每个消息都由int标识。我想将每个处理程序定义为模板方法的实例化。模板处理程序方法

的想法是这样的:

handlers.h

enum Handler { 
    MESSAGE1, 
    MESSAGE2 
}; 

template<MESSAGE1> 
void handle() { 
} 

的main.cpp

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

当然,这段代码不能编译,因为MESSAGE1不是一个类型。 那么,我怎么能为每条消息创建一个不同的类型?此外,我想保持这些类型的使用尽可能有意义(因此使用枚举)。

回答

5

你想要什么所谓非类型模板参数模板特

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

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

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

可以使用std::integral_constant(或自己写空类型的包装做同样的事情)来包装你的枚举分为不同的类型:

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>{});