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类型
继承