网站做镜像是什么,王烨霖,企业网站建设怎么样,郑州艾特网站建设公司类型萃取:类型检查 Type-Traits Library:Type Checks — C20
Type-Traits library 在C11的时候就已经发布,但依然随着C版本在不断更新
类型检查 Type Checks
每种类型就是十四种主要类型之一
主要类型
template class T struct is_void;
template class T…类型萃取:类型检查 Type-Traits Library:Type Checks — C20
Type-Traits library 在C11的时候就已经发布,但依然随着C版本在不断更新
类型检查 Type Checks
每种类型就是十四种主要类型之一
主要类型
template class T struct is_void;
template class T struct is_integral;
template class T struct is_floating_point;
template class T struct is_array;
template class T struct is_pointer;
template class T struct is_null_pointer;
template class T struct is_member_object_pointer;
template class T struct is_member_function_pointer;
template class T struct is_enum;
template class T struct is_union;
template class T struct is_class;
template class T struct is_function;
template class T struct is_lvalue_reference;
template class T struct is_rvalue_reference;例子:
#include iostream
#include type_traits
#include iostream
#include type_traitsstruct A
{int a;int f(int) { return 2011; }
};enum E
{e 1,
};union U
{int u;
};int main()
{using namespace std;cout boolalpha \n; // boolalpha: bool 以 true 或 false输出cout is_voidvoid::value \n; // true cout is_integralshort::value \n; // truecout is_floating_pointdouble::value \n; // truecout is_arrayint[]::value \n; // truecout is_pointerint*::value \n; // truecout is_null_pointernullptr_t::value \n; // truecout is_member_object_pointerint A::*::value \n; // truecout is_member_function_pointerint (A::*)(int)::value \n; // truecout is_enumE::value \n; // truecout is_unionU::value \n; // true cout is_classstring::value \n; // truecout is_functionint*(double)::value \n; // true cout is_lvalue_referenceint::value \n; // truecout is_rvalue_referenceint::value \n; // true
}
让我们试着实验一下这个魔法
#include iostream
#include type_traits
#include iostream
#include type_traitsnamespace fx
{template class T, T vstruct intergral_constant{static constexpr T value v;using value_type T;using type intergral_constant;constexpr operator value_type() const noexcept{return value;}constexpr value_type operator()() const noexcept{return value;}};using true_type intergral_constantbool, true;using false_type intergral_constantbool, false;template class Tstruct is_integral : public false_type{};template struct is_integralbool : public true_type{};template struct is_integralchar : public true_type{};template struct is_integralsigned char : public true_type{};template struct is_integralunsigned char : public true_type{};template struct is_integralwchar_t : public true_type{};template struct is_integralshort : public true_type{};template struct is_integralint : public true_type{};template struct is_integrallong : public true_type{};template struct is_integrallong long : public true_type{};template struct is_integralunsigned short : public true_type{};template struct is_integralunsigned int : public true_type{};template struct is_integralunsigned long : public true_type{};template struct is_integralunsigned long long : public true_type{};
}int main(int argc, char* argv[])
{std::cout fx::is_integralint::value std::endl;}
fx::is_integral::value作为返回值,这是元函数的命名约定
自从C17之后,有了一个更便捷的方式:
template class T
inline constexpr bool is_integral_v is_integralT::value这样可以使用std::integral_vT代替std::integralint::value
复合类型 Composite Type Categories
Composite data type - Wikipedia 对于主要类型和复合类型,类型萃取库提供类型属性和类型属性查询
类型属性
template class T struct is_const;
template class T struct is_volatile;
template class T struct is_trivial;
template class T struct is_trivially_copyable;
template class T struct is_standard_layout;
template class T struct is_empty;
template class T struct is_polymorphic;
template class T struct is_abstract;
template class T struct is_final;
template class T struct is_aggregate;template class T struct is_signed;
template class T struct is_unsigned;
template class T struct is_bounded_array;
template class T struct is_unbounded_array;
template class T struct is_scoped_enum;template class T, class... Args struct is_constructible;
template class T struct is_default_constructible;
template class T struct is_copy_constructible;
template class T struct is_move_constructible;template class T, class U struct is_assignable;
template class T struct is_copy_assignable;
template class T struct is_move_assignable;template class T, class U struct is_swappable_with;
template class T struct is_swappable;template class T struct is_destructible;template class T, class... Args struct is_trivially_constructible;
template class T struct is_trivially_default_constructible;
template class T struct is_trivially_copy_constructible;
template class T struct is_trivially_move_constructible;template class T, class U struct is_trivially_assignable;
template class T struct is_trivially_copy_assignable;
template class T struct is_trivially_move_assignable;
template class T struct is_trivially_destructible;template class T, class... Args struct is_nothrow_constructible;
template class T struct is_nothrow_default_constructible;
template class T struct is_nothrow_copy_constructible;
template class T struct is_nothrow_move_constructible;template class T, class U struct is_nothrow_assignable;
template class T struct is_nothrow_copy_assignable;
template class T struct is_nothrow_move_assignable;template class T, class U struct is_nothrow_swappable_with;
template class T struct is_nothrow_swappable;template class T struct is_nothrow_destructible;template class T struct has_virtual_destructor;template class T struct has_unique_object_representations;类型属性查询
template class T struct alignment_of;
template class T struct rank;
template class T, unsigned I 0 struct extent;template struct has_virtual_destructor;
template struct has_unique_object_representations; ### 类型属性查询cpp
template class T struct alignment_of;
template class T struct rank;
template class T, unsigned I 0 struct extent;