目录
std::is_union、std::is_class、std::integral_constant
std::is_union
- std::is_union是类模板。用于判断某个类型是否是一个联合类型。
template <typename T> struct is_union{.....};
【示例】
struct A {}; union B { int num; char type; }; cout << std::is_union<A>::value << endl; //如果是联合,value就为true(1),否则为false(0) cout << std::is_union<B>::value << endl;
- 输出
【std::is_union_v(C++17)】
template <class T> inline constexpr bool is_union_v = is_union<T>::value;
【示例】
struct A {}; union B { int num; char type; }; cout << std::is_union_v<A> << endl; //如果是联合,value就为true(1),否则为false(0) cout << std::is_union_v<B> << endl;
- 输出
std::is_class
- std::is_class是类模板。用于判断某个类型是否是一个类类型(联合不是类类型)。
template <typename T> struct is_class{.....};
【示例】
struct A {}; union B { int num; char type; }; cout << std::is_class<A>::value << endl; cout << std::is_class<B>::value << endl;
- 输出
【std::is_class_v(C++17)】
template <class T> inline constexpr bool is_class_v = is_class<T>::value;
【示例】
struct A {}; union B { int num; char type; }; cout << std::is_class_v<A> << endl; cout << std::is_class_v<B> << endl;
- 输出
std::integral_constant
- C++11新标准引入的类模板。
- integral_constant是一个用于包装目的的类。
template <class 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; } constexpr value_type operator()() const noexcept { return value; } };
【示例】
cout << std::integral_constant<int,15>::value << endl; cout << std::integral_constant<bool, true>::value << endl;
- 输出
【综合应用】
std::integral_constant<bool, !std::is_union<B>::value> myobj1; cout << myobj1.value << endl; std::integral_constant<bool, !std::is_union<A>::value> myobj2; cout << myobj2.value << endl;
- 通过integral_constant的包装,把 !std::is_union<B>::value 这个值(0)包装成了一个类型:
- std::integral_constant<bool, !std::is_union<B>::value>
- 在很多需要用到类型的场合(比如函数返回类型中)就可以使用这个类型。
- 注意:!std::is_union<B>::value值在编译时就能确定。