Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板处理程序方法_C++_Templates - Fatal编程技术网

C++ 模板处理程序方法

C++ 模板处理程序方法,c++,templates,C++,Templates,假设我想对不同类型的消息使用不同的处理程序,每条消息都由int标识。我想将每个处理程序定义为模板方法的实例化 这个想法是这样的: h enum Handler { MESSAGE1, MESSAGE2 }; template<MESSAGE1> void handle() { } enum处理程序{ 信息1, 信息2 }; 样板 无效句柄(){ } main.cpp int main() { handle<Handler::MESSAGE>(

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

这个想法是这样的:

h

enum Handler {
    MESSAGE1,
    MESSAGE2
};

template<MESSAGE1>
void handle() {
}
enum处理程序{
信息1,
信息2
};
样板
无效句柄(){
}
main.cpp

int main()
{
    handle<Handler::MESSAGE>();
}
intmain()
{
句柄();
}
当然,此代码不会编译,因为
MESSAGE1
不是类型。 那么,如何为每条消息创建不同的类型呢?此外,我希望尽可能保持这些类型的使用(因此使用枚举)。

您希望使用模板专用化的非类型模板参数:

模板无效句柄();//违约
模板无效句柄(){
// ...
}
模板无效句柄(){
// ...
}
您需要具有模板专门化的所谓非类型模板参数:

模板无效句柄();//违约
模板无效句柄(){
// ...
}
模板无效句柄(){
// ...
}

您可以使用
std::integral_constant
(或者编写自己的空类型包装器来完成相同的工作)将枚举包装为类型:

template <Handler H>
using handle_t = std::integral_constant<Handler, H>;
模板
使用handle_t=std::integral_常量;
然后在不同类型上重载:

void handle(handle_t<MESSAGE1> ) { ... }
void handle(handle_t<MESSAGE2> ) { ... }
void句柄(句柄){…}
无效句柄(句柄{…}
您可以通过以下方式拨打:

handle(handle_t<MESSAGE1>{} );
handle(handle\u t{});

您可以使用
std::integral_constant
(或者编写自己的空类型包装器来完成相同的工作)将枚举包装为类型:

template <Handler H>
using handle_t = std::integral_constant<Handler, H>;
模板
使用handle_t=std::integral_常量;
然后在不同类型上重载:

void handle(handle_t<MESSAGE1> ) { ... }
void handle(handle_t<MESSAGE2> ) { ... }
void句柄(句柄){…}
无效句柄(句柄{…}
您可以通过以下方式拨打:

handle(handle_t<MESSAGE1>{} );
handle(handle\u t{});