使用专业化测试 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_type
和 true_type
继承。
假设我有以下 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_type
和 true_type
继承。