C++ 使用专门化测试类中是否存在值

C++ 使用专门化测试类中是否存在值,c++,c++11,sfinae,C++,C++11,Sfinae,假设我有以下课程: struct Color { enum { blue, red, unknown }; }; 我想在编译时测试类Color是否有未知值 我认为下面的方法可能有效,但目前返回的结果不正确 #include <iostream> template <typename T, typename U = T> struct test { static constexpr bool value = false

假设我有以下课程:

struct Color
{
   enum {
      blue,
      red,
      unknown
   };
};
我想在编译时测试类Color是否有未知值

我认为下面的方法可能有效,但目前返回的结果不正确

#include <iostream>

template <typename T, typename U = T>
struct test
{
  static constexpr bool value = false;
};

template <typename T>
struct test<T, decltype(T::unknown)>
{
  static constexpr bool value = true;
};

int main()
{
  std::cout << test<Color>::value << std::endl; //prints 0
}
#包括
模板
结构测试
{
静态constexpr bool值=false;
};
模板
结构测试
{
静态constexpr布尔值=真;
};
int main()
{
std::cout当您编写
test
时,我们首先实例化
test
的主要专门化,其中包括填充默认模板参数。因此我们得到
test

接下来,我们尝试查看是否有任何专门化匹配。一个专门化用于
test
。这不匹配,所以我们坚持使用主

这种类型不匹配是存在的原因-因此我们在主节点上的默认模板参数可以匹配专门化:

template <typename T, typename U = void>
//                              ~~~~~~~
struct test
{
  static constexpr bool value = false;
};

template <typename T>
struct test<T, void_t<decltype(T::unknown)>>
//             ~~~~~~~                    ~
{
  static constexpr bool value = true;
};
模板
//                              ~~~~~~~
结构测试
{
静态constexpr bool值=false;
};
模板
结构测试
//             ~~~~~~~                    ~
{
静态constexpr布尔值=真;
};
另外,更愿意分别从
false\u类型
true\u类型
继承