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 + -
显示快捷键?