test_type_traits.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 160 行

CPP
160
字号
//  (C) Copyright John Maddock 2005.//  Use, modification and distribution are subject to the//  Boost Software License, Version 1.0. (See accompanying file//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifdef TEST_STD_HEADERS#include <type_traits>#else#include <boost/tr1/type_traits.hpp>#endif#include <boost/static_assert.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/type_traits/is_base_and_derived.hpp>template <class T>void check_value_trait(const T&){   T t;   (void)t;   typedef typename T::type type;   typedef typename T::value_type value_type;   BOOST_STATIC_ASSERT((::boost::is_base_and_derived<      std::tr1::integral_constant<value_type, T::value>, T>::value));   BOOST_STATIC_ASSERT((::boost::is_same<      std::tr1::integral_constant<value_type, T::value>, type>::value));}template <class T>void check_transform_trait(const T* p){   typedef typename T::type type;}struct UDT{};union union_type{ char c; int i; };enum enum_type{ one, two };#define check_unary_trait(trait)\   check_value_trait(std::tr1::trait<void>());\   check_value_trait(std::tr1::trait<int>());\   check_value_trait(std::tr1::trait<float>());\   check_value_trait(std::tr1::trait<UDT>());\   /*check_value_trait(std::tr1::trait<union_type>());*/\   check_value_trait(std::tr1::trait<enum_type>());\   check_value_trait(std::tr1::trait<void *>());\   check_value_trait(std::tr1::trait<UDT&>());\   check_value_trait(std::tr1::trait<int (void)>());\   check_value_trait(std::tr1::trait<int (&)(void)>());\   check_value_trait(std::tr1::trait<int (*)(void)>());\   check_value_trait(std::tr1::trait<int (UDT::*)(void)>());\   check_value_trait(std::tr1::trait<int (UDT::*)>());\   check_value_trait(std::tr1::trait<int[4]>());\   check_value_trait(std::tr1::trait<int[]>());#define check_binary_trait(trait)\   check_value_trait(std::tr1::trait<void, int>());\   check_value_trait(std::tr1::trait<int, double>());\   check_value_trait(std::tr1::trait<float, float>());\   check_value_trait(std::tr1::trait<UDT, UDT&>());\   /*check_value_trait(std::tr1::trait<union_type>());*/\   check_value_trait(std::tr1::trait<enum_type, enum_type>());\   check_value_trait(std::tr1::trait<void *, const void*>());\   check_value_trait(std::tr1::trait<UDT&, int>());\   check_value_trait(std::tr1::trait<int (void), int (void)>());\   check_value_trait(std::tr1::trait<int (&)(void), int (void)>());\   check_value_trait(std::tr1::trait<int (*)(void), int (void)>());\   check_value_trait(std::tr1::trait<int (UDT::*)(void), int (void)>());\   check_value_trait(std::tr1::trait<int (UDT::*), int (UDT::*)>());\   check_value_trait(std::tr1::trait<int[4], int[3]>());\   check_value_trait(std::tr1::trait<int[4], int[4]>());#define check_transform(trait)\   check_transform_trait((std::tr1::trait<void>*)(0));\   check_transform_trait((std::tr1::trait<int>*)(0));\   check_transform_trait((std::tr1::trait<float>*)(0));\   check_transform_trait((std::tr1::trait<UDT>*)(0));\   check_transform_trait((std::tr1::trait<enum_type>*)(0));\   check_transform_trait((std::tr1::trait<void *>*)(0));\   check_transform_trait((std::tr1::trait<UDT&>*)(0));\   check_transform_trait((std::tr1::trait<int (void)>*)(0));\   check_transform_trait((std::tr1::trait<int (&)(void)>*)(0));\   check_transform_trait((std::tr1::trait<int (*)(void)>*)(0));\   check_transform_trait((std::tr1::trait<int (UDT::*)(void)>*)(0));\   check_transform_trait((std::tr1::trait<int (UDT::*)>*)(0));\   check_transform_trait((std::tr1::trait<int[4]>*)(0));int main(){   check_unary_trait(is_void);   check_unary_trait(is_integral);   check_unary_trait(is_floating_point);   check_unary_trait(is_array);   check_unary_trait(is_pointer);   check_unary_trait(is_reference);   check_unary_trait(is_member_object_pointer);   check_unary_trait(is_member_function_pointer);   check_unary_trait(is_enum);   check_unary_trait(is_union);   check_unary_trait(is_class);   check_unary_trait(is_function);   check_unary_trait(is_arithmetic);   check_unary_trait(is_fundamental);   check_unary_trait(is_object);   check_unary_trait(is_scalar);   check_unary_trait(is_compound);   check_unary_trait(is_member_pointer);   check_unary_trait(is_const);   check_unary_trait(is_volatile);   check_unary_trait(is_pod);   check_unary_trait(is_empty);   check_unary_trait(is_polymorphic);   check_unary_trait(is_abstract);   check_unary_trait(has_trivial_constructor);   check_unary_trait(has_trivial_copy);   check_unary_trait(has_trivial_assign);   check_unary_trait(has_trivial_destructor);   check_unary_trait(has_nothrow_constructor);   check_unary_trait(has_nothrow_copy);   check_unary_trait(has_nothrow_assign);   check_unary_trait(has_virtual_destructor);   check_unary_trait(is_signed);   check_unary_trait(is_unsigned);   check_value_trait(std::tr1::alignment_of<int>());   check_value_trait(std::tr1::alignment_of<UDT>());   check_value_trait(std::tr1::alignment_of<int[4]>());   check_unary_trait(rank);   check_unary_trait(extent);      check_binary_trait(is_same);   check_binary_trait(is_base_of);   check_binary_trait(is_convertible);   check_transform(remove_const);   check_transform(remove_volatile);   check_transform(remove_cv);   check_transform(add_const);   check_transform(add_volatile);   check_transform(add_cv);   check_transform(remove_reference);   check_transform(add_reference);   check_transform(remove_extent);   check_transform(remove_all_extents);   check_transform(remove_pointer);   check_transform(add_pointer);   check_transform_trait((::std::tr1::aligned_storage<1,1>*)(0));   check_transform_trait((::std::tr1::aligned_storage<4,1>*)(0));   check_transform_trait((::std::tr1::aligned_storage<2,2>*)(0));   check_transform_trait((::std::tr1::aligned_storage<4,2>*)(0));   check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0));   check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0));   check_transform_trait((::std::tr1::aligned_storage<8,8>*)(0));   return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?