假设我想为不同类型的消息提供不同的处理程序,每条消息都由int
标识。我想将每个处理程序定义为模板方法的实例化。
这个想法是这样的:
handlers.h
enum Handler {
MESSAGE1,
MESSAGE2
};
template<MESSAGE1>
void handle() {
}
的main.cpp
int main()
{
handle<Handler::MESSAGE>();
}
当然,此代码无法编译,因为MESSAGE1
不是类型。
那么,我怎样才能为每条消息创建不同的类型?另外,我希望尽可能保持这些类型的使用(因此使用枚举)。
答案 0 :(得分:5)
您想要模板专业化所谓的非类型模板参数:
template<Handlers H> void handle(); // default
template<> void handle<MESSAGE1>() {
// ...
}
template<> void handle<MESSAGE2>() {
// ...
}
答案 1 :(得分: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>{} );