[英]c++ template specialization based on compile time value
我很想进入模板元编程,慢慢地,我不知道如何实现以下内容:
// hpp file
enum MyEnum { Alive = 0, Dead };
class A {
public:
template<typename T, typename O, MyEnum ls>
static int Register();
};
// elsewhere in the code...
A::Register<IType1, Type1, Dead>();
在编译时,我将知道第三个模板类型的枚举值(编译时不变量),死亡或活动。 是否可以为Register函数定义两个实体,如:
// desired hpp file
template<typename T, typename O, Alive>
int Register();
template<typename T, typename O, Dead>
int Register();
// corresponding desired .inc file
template<typename T, typename O, Alive>
int Register() { // Alive specific implementation ... }
template<typename T, typename O, Dead>
int Register() { // Dead specific implementation ... }
我看了一下: 具有常量值的C ++模板专业化
但我无法弄清楚如何使它适用于这种情况。
模板函数不能部分专门化。 解决方案是将其包装在结构中:
template<typename T, typename O, MyEnum ls>
struct foo;
template<typename T, typename O>
struct foo <T, O, Alive> {
static int Register() {
// ...
}
};
template<typename T, typename O>
struct foo <T, O, Dead> {
static int Register() {
// ...
}
};
template<typename T, typename O, MyEnum ls>
int Register() {
return foo<T, O, ls>::Register();
}
这里聚会很晚,但是。
我认为这样做的一种方法在概念上更简单,也更容易阅读,只是简单地使你的枚举不同类型的不同值(在命名空间内,保持干净),并利用(模板)函数重载:
namespace State {
struct Dead {};
struct Alive {};
}
template<typename T, typename O>
int Register(State::Dead) {
return 1;
}
template<typename T, typename O>
int Register(State::Alive) {
return 2;
}
你这样打电话给他们:
int main() {
Register<int,int>(State::Dead());
Register<int,int>(State::Alive());
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.