基于编译时间值的c ++模板专业化

Sho*_*ort 11 c++ templates metaprogramming compile-time-constant

我很想进入模板元编程,慢慢地,我不知道如何实现以下内容:

// 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>();
Run Code Online (Sandbox Code Playgroud)

在编译时,我将知道第三个模板类型的枚举值(编译时不变量),死亡或活动.是否可以为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 ...  }
Run Code Online (Sandbox Code Playgroud)

我看了一下: 具有常量值的C++模板专业化

但我无法弄清楚如何使它适用于这种情况.

Pub*_*bby 13

模板函数不能部分专门化.解决方案是将其包装在结构中:

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();
}
Run Code Online (Sandbox Code Playgroud)