类型的C++ constexpr值

Pet*_*efi 6 c++ templates unique constexpr c++11

我希望能够在类型的ID上创建switch语句.我找到了一种机制,可以为不同类型提供唯一的ID.这很简单:

template <typename T>
struct type { 
    static void id() { } 
};

template <typename T>
constexpr const size_t type_id() {
    return reinterpret_cast<size_t>(&type<T>::id); 
}
Run Code Online (Sandbox Code Playgroud)

我认为这将评估为一个常量,我可以用作开关的情况.但是当我执行以下操作时,我得到一个错误,即case表达式不是常量:

int main(void) {
    size_t a = type_id<int>();
    switch (a) {
    case type_id<int>():
        break;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么不是常数?我怎么能达到这个效果?

编辑:

如果没有reinterpret_cast,我可以做这样的事情吗?

max*_*x66 4

我不确定这是一个好主意,但是......只是为了好玩......使用本页中constexpr建议的计数器,您应该能够替换指针的值。

以下是(我重复一遍:只是为了好玩)完整的实验

#include <iostream>

template <int N>
struct flag
 { friend constexpr int adl_flag (flag<N>); };

template <int N>
struct writer
 {
   friend constexpr int adl_flag (flag<N>)
    { return N; }

   static constexpr int value { N };
 };

template <int N, int = adl_flag (flag<N> {})>
int constexpr reader (int, flag<N>)
 { return N; }

template <int N>
int constexpr reader (float, flag<N>, int R = reader (0, flag<N-1> {}))
 { return R; }

int constexpr reader (float, flag<0>)
 { return 0; }

template <int N = 1>
int constexpr next (int R = writer<reader (0, flag<32> {}) + N>::value)
 { return R; }

template <typename T>
struct type
 { 
   static constexpr int id { next() };

   constexpr static int type_id ()
    { return id; }
 };

void printType (int idT )
 {
   switch ( idT )
    {
      case type<int>::type_id():
         std::cout << "- int type" << std::endl;
         break;

      case type<long>::id:
         std::cout << "- long type" << std::endl;
         break;

      default:
         std::cout << "- another type" << std::endl;
         break;
    }
 }

int main ()
 {
   int ii { type<int>::id };
   int il { type<long>::type_id() };

   printType(ii);
   printType(il);
 }
Run Code Online (Sandbox Code Playgroud)