一、std::is_union
s t d : : i s _ u n i o n std::is\_union std::is_union是 C + + 11 C++11 C++11引入的类模板,用于判断一个类是否是一个联合 u n i o n union union类型。
这个类模板中有一个 v a l u e value value成员,如果类型 T T T是 u n i o n union union类型,那么这个 v a l u e value value的值为 1 1 1,否则为 0 0 0。
由于这个模板的实现与编译器内部的支持有关,因此更详细的源码需要查阅相应的资料。
这里展示一下基本的使用方法:
首先定义一个结构体和联合体:
struct A {};
union B {
int num;
char type;
};
调用测试函数,打印相应的类名和 v a l u e value value的值:
void Test1() {
std::cout << typeid(std::is_union<A>::type).name() << std::endl;
std::cout << typeid(std::is_union<B>::type).name() << std::endl;
std::cout << typeid(std::is_union<A>::value_type).name()<< std::endl;
std::cout << std::is_union<A>::value << std::endl;
std::cout << std::is_union<B>::value << std::endl;
//变量模板
std::cout << std::is_union_v<A> << std::endl;
}
其中, C + + 17 C++17 C++17之后,有相应的变量模板 i s _ u n i o n _ v is\_union\_v is_union_v可供使用,直接调用其内部的 v a l u e value value值:
运行结果如下:
可以发现,其类型就是 s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant,是一个类模板,可以看作是整型常量的包装。
二、std::is_class
s t d : : i s _ c l a s s std::is\_class std::is_class是 C + + 11 C++11 C++11引入的一个类模板,用于判断一个类是否是类类型,使用方法和 i s _ u n i o n is\_union is_union类似。
在 C + + 17 C++17 C++17之后同样有相应的变量模板:
调用测试函数:
void Test2() {
std::cout << typeid(std::is_class<A>::type).name() << std::endl;
std::cout << typeid(std::is_class<B>::type).name() << std::endl;
std::cout << typeid(std::is_class<A>::value_type).name() << std::endl;
std::cout << std::is_class<A>::value << std::endl;
std::cout << std::is_class<B>::value << std::endl;
//变量模板
std::cout << std::is_class_v<A> << std::endl;
}
其类型同样是 s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant:
三、std::integral_constant
s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant是 C + + 11 C++11 C++11引入的类模板,主要用于包装一个整数或者布尔类型,其源码大致如下:
//std::intgral_constant源码实现
template<typename T,T _Val>
struct integral_constant {
static constexpr T value = _Val;
using value_type = T;
using type = integral_constant;
constexpr operator value_type() const noexcept { return value; } //运行类型转换为T类型
constexpr value_type operator()() const noexcept { return value; } //重载括号运算符
};
重点部分就是静态成员变量 v a l u e value value,以及定义其类型的别名 t y p e type type和值的类型 v a l u e _ t y p e value\_type value_type。
下面是简单的一种使用:
void Test4() {
std::cout << integral_constant<int, 100>::value << std::endl;
std::cout << typeid(integral_constant<int, 100>::value_type).name() << std::endl;
std::cout << typeid(integral_constant<bool, true>::type).name() << std::endl;
}
可以提取出它的类和相应包装的值的大小:
同样,我们也可以将类似 ! s t d : : i s _ u n i o n < T > : : v a l u e !std::is\_union<T>::value !std::is_union<T>::value的值包装成类,如下:
void Test5() {
//把!is_union<A>::value包装成类
std::integral_constant<bool, !std::is_union<A>::value>myobj;
std::cout << typeid(myobj).name() << std::endl;
std::cout << typeid(myobj.value).name() << std::endl;
std::cout << myobj.value << std::endl;
}
运行结果如下:
这样做的意义在于,有的时候我们需要一个类型,而不是一个值,如函数返回的类型中,我们可以通过包装将值变成类作为返回的类型。
标签:std,constant,进阶,union,integral,value,type From: https://blog.csdn.net/Antonio915/article/details/143808653