模板处理方法

时间:2016-05-16 19:16:37

标签: c++ templates

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

这个想法是这样的:

handlers.h

enum Handler {
    MESSAGE1,
    MESSAGE2
};

template<MESSAGE1>
void handle() {
}

的main.cpp

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

当然,此代码无法编译,因为MESSAGE1不是类型。 那么,我怎样才能为每条消息创建不同的类型?另外,我希望尽可能保持这些类型的使用(因此使用枚举)。

2 个答案:

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