使用专业化测试 class 中值的存在

Using specialization to test the existence of a value within a class

假设我有以下 class:

struct Color
{
   enum {
      blue,
      red,
      unknown
   };
};

我想在编译时测试 class 颜色是否具有未知值。

我认为以下方法可行,但目前返回的结果不正确。

#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
}

您能否提供一些有关我如何完成检查的见解? 或者我的例子有什么问题?

谢谢

当你写test<Color>的时候,我们首先实例化test的初级特化,其中包括填充默认的模板参数。所以我们得到 test<Color, Color>.

接下来,我们尝试查看是否有任何专业匹配。一个专业是 test<Color, Color::<unnamed>>。这不匹配,所以我们坚持使用主!

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

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

此外,更喜欢分别从 false_typetrue_type 继承。