基于编译时值的 C++ 模板专用化

c++ template specialization based on compile time value

本文关键字:C++ 专用 于编译 编译      更新时间:2023-10-16

我正在慢慢地进入模板元编程,我不确定如何实现以下内容:

// 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>();
在编译时,

我将知道第三个模板类型(编译时不变(的枚举值是什么,要么是死的,要么是活的。是否可以为寄存器函数定义两个主体,如下所示:

// 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;
}