/
usr
/
include
/
boost
/
type_traits
/
/usr/include/boost/type_traits
mkdir
upload
Name
Size
Mode
Actions
detail/
-
0755
rm
add_const.hpp
1439
0644
edit
dl
rm
add_cv.hpp
1399
0644
edit
dl
rm
add_lvalue_reference.hpp
768
0644
edit
dl
rm
add_pointer.hpp
1505
0644
edit
dl
rm
add_reference.hpp
1709
0644
edit
dl
rm
add_rvalue_reference.hpp
2395
0644
edit
dl
rm
add_volatile.hpp
1424
0644
edit
dl
rm
aligned_storage.hpp
3350
0644
edit
dl
rm
alignment_of.hpp
3575
0644
edit
dl
rm
alignment_traits.hpp
573
0644
edit
dl
rm
arithmetic_traits.hpp
862
0644
edit
dl
rm
array_traits.hpp
569
0644
edit
dl
rm
broken_compiler_spec.hpp
724
0644
edit
dl
rm
common_type.hpp
4555
0644
edit
dl
rm
composite_traits.hpp
1001
0644
edit
dl
rm
conditional.hpp
843
0644
edit
dl
rm
config.hpp
708
0644
edit
dl
rm
conjunction.hpp
889
0644
edit
dl
rm
conversion_traits.hpp
658
0644
edit
dl
rm
copy_cv.hpp
1058
0644
edit
dl
rm
copy_cv_ref.hpp
790
0644
edit
dl
rm
copy_reference.hpp
1044
0644
edit
dl
rm
cv_traits.hpp
994
0644
edit
dl
rm
decay.hpp
1496
0644
edit
dl
rm
declval.hpp
1899
0644
edit
dl
rm
detected.hpp
569
0644
edit
dl
rm
detected_or.hpp
670
0644
edit
dl
rm
disjunction.hpp
891
0644
edit
dl
rm
enable_if.hpp
829
0644
edit
dl
rm
extent.hpp
3751
0644
edit
dl
rm
floating_point_promotion.hpp
1071
0644
edit
dl
rm
function_traits.hpp
4801
0644
edit
dl
rm
has_bit_and.hpp
1572
0644
edit
dl
rm
has_bit_and_assign.hpp
1841
0644
edit
dl
rm
has_bit_or.hpp
1569
0644
edit
dl
rm
has_bit_or_assign.hpp
1839
0644
edit
dl
rm
has_bit_xor.hpp
1571
0644
edit
dl
rm
has_bit_xor_assign.hpp
1842
0644
edit
dl
rm
has_complement.hpp
936
0644
edit
dl
rm
has_dereference.hpp
16135
0644
edit
dl
rm
has_divides.hpp
1156
0644
edit
dl
rm
has_divides_assign.hpp
1513
0644
edit
dl
rm
has_equal_to.hpp
1762
0644
edit
dl
rm
has_greater.hpp
1756
0644
edit
dl
rm
has_greater_equal.hpp
1775
0644
edit
dl
rm
has_left_shift.hpp
1581
0644
edit
dl
rm
has_left_shift_assign.hpp
1851
0644
edit
dl
rm
has_less.hpp
1750
0644
edit
dl
rm
has_less_equal.hpp
1769
0644
edit
dl
rm
has_logical_and.hpp
1212
0644
edit
dl
rm
has_logical_not.hpp
998
0644
edit
dl
rm
has_logical_or.hpp
1208
0644
edit
dl
rm
has_minus.hpp
6520
0644
edit
dl
rm
has_minus_assign.hpp
6809
0644
edit
dl
rm
has_modulus.hpp
1570
0644
edit
dl
rm
has_modulus_assign.hpp
1841
0644
edit
dl
rm
has_multiplies.hpp
1162
0644
edit
dl
rm
has_multiplies_assign.hpp
1521
0644
edit
dl
rm
has_negate.hpp
731
0644
edit
dl
rm
has_new_operator.hpp
5166
0644
edit
dl
rm
has_nothrow_assign.hpp
3766
0644
edit
dl
rm
has_nothrow_constructor.hpp
2633
0644
edit
dl
rm
has_nothrow_copy.hpp
3047
0644
edit
dl
rm
has_nothrow_destructor.hpp
2204
0644
edit
dl
rm
has_not_equal_to.hpp
1774
0644
edit
dl
rm
has_operator.hpp
2282
0644
edit
dl
rm
has_plus.hpp
1800
0644
edit
dl
rm
has_plus_assign.hpp
6891
0644
edit
dl
rm
has_post_decrement.hpp
1932
0644
edit
dl
rm
has_post_increment.hpp
1932
0644
edit
dl
rm
has_pre_decrement.hpp
1922
0644
edit
dl
rm
has_pre_increment.hpp
1923
0644
edit
dl
rm
has_right_shift.hpp
1584
0644
edit
dl
rm
has_right_shift_assign.hpp
1854
0644
edit
dl
rm
has_trivial_assign.hpp
2208
0644
edit
dl
rm
has_trivial_constructor.hpp
2233
0644
edit
dl
rm
has_trivial_copy.hpp
2417
0644
edit
dl
rm
has_trivial_destructor.hpp
1683
0644
edit
dl
rm
has_trivial_move_assign.hpp
2666
0644
edit
dl
rm
has_trivial_move_constructor.hpp
2939
0644
edit
dl
rm
has_unary_minus.hpp
746
0644
edit
dl
rm
has_unary_plus.hpp
690
0644
edit
dl
rm
has_virtual_destructor.hpp
901
0644
edit
dl
rm
ice.hpp
768
0644
edit
dl
rm
integral_constant.hpp
2546
0644
edit
dl
rm
integral_promotion.hpp
6268
0644
edit
dl
rm
intrinsics.hpp
22018
0644
edit
dl
rm
is_abstract.hpp
4501
0644
edit
dl
rm
is_arithmetic.hpp
778
0644
edit
dl
rm
is_array.hpp
1755
0644
edit
dl
rm
is_assignable.hpp
3925
0644
edit
dl
rm
is_base_and_derived.hpp
7997
0644
edit
dl
rm
is_base_of.hpp
1500
0644
edit
dl
rm
is_base_of_tr1.hpp
1486
0644
edit
dl
rm
is_bounded_array.hpp
912
0644
edit
dl
rm
is_class.hpp
3595
0644
edit
dl
rm
is_complete.hpp
2803
0644
edit
dl
rm
is_complex.hpp
952
0644
edit
dl
rm
is_compound.hpp
848
0644
edit
dl
rm
is_const.hpp
1630
0644
edit
dl
rm
is_constructible.hpp
4350
0644
edit
dl
rm
is_convertible.hpp
18672
0644
edit
dl
rm
is_copy_assignable.hpp
4904
0644
edit
dl
rm
is_copy_constructible.hpp
6813
0644
edit
dl
rm
is_default_constructible.hpp
4526
0644
edit
dl
rm
is_destructible.hpp
2572
0644
edit
dl
rm
is_detected.hpp
752
0644
edit
dl
rm
is_detected_convertible.hpp
815
0644
edit
dl
rm
is_detected_exact.hpp
796
0644
edit
dl
rm
is_empty.hpp
3004
0644
edit
dl
rm
is_enum.hpp
4996
0644
edit
dl
rm
is_final.hpp
868
0644
edit
dl
rm
is_float.hpp
789
0644
edit
dl
rm
is_floating_point.hpp
1374
0644
edit
dl
rm
is_function.hpp
808
0644
edit
dl
rm
is_fundamental.hpp
996
0644
edit
dl
rm
is_integral.hpp
3845
0644
edit
dl
rm
is_list_constructible.hpp
1746
0644
edit
dl
rm
is_lvalue_reference.hpp
2012
0644
edit
dl
rm
is_member_function_pointer.hpp
825
0644
edit
dl
rm
is_member_object_pointer.hpp
839
0644
edit
dl
rm
is_member_pointer.hpp
1969
0644
edit
dl
rm
is_noncopyable.hpp
1067
0644
edit
dl
rm
is_nothrow_move_assignable.hpp
3964
0644
edit
dl
rm
is_nothrow_move_constructible.hpp
4043
0644
edit
dl
rm
is_nothrow_swappable.hpp
2405
0644
edit
dl
rm
is_object.hpp
907
0644
edit
dl
rm
is_pod.hpp
1809
0644
edit
dl
rm
is_pointer.hpp
1901
0644
edit
dl
rm
is_polymorphic.hpp
3187
0644
edit
dl
rm
is_reference.hpp
938
0644
edit
dl
rm
is_rvalue_reference.hpp
981
0644
edit
dl
rm
is_same.hpp
1511
0644
edit
dl
rm
is_scalar.hpp
966
0644
edit
dl
rm
is_scoped_enum.hpp
640
0644
edit
dl
rm
is_signed.hpp
6652
0644
edit
dl
rm
is_stateless.hpp
1127
0644
edit
dl
rm
is_trivially_copyable.hpp
713
0644
edit
dl
rm
is_unbounded_array.hpp
843
0644
edit
dl
rm
is_union.hpp
1075
0644
edit
dl
rm
is_unscoped_enum.hpp
593
0644
edit
dl
rm
is_unsigned.hpp
6772
0644
edit
dl
rm
is_virtual_base_of.hpp
6146
0644
edit
dl
rm
is_void.hpp
890
0644
edit
dl
rm
is_volatile.hpp
1665
0644
edit
dl
rm
make_signed.hpp
4621
0644
edit
dl
rm
make_unsigned.hpp
4691
0644
edit
dl
rm
make_void.hpp
1052
0644
edit
dl
rm
negation.hpp
472
0644
edit
dl
rm
nonesuch.hpp
702
0644
edit
dl
rm
object_traits.hpp
1441
0644
edit
dl
rm
promote.hpp
755
0644
edit
dl
rm
rank.hpp
2585
0644
edit
dl
rm
reference_traits.hpp
590
0644
edit
dl
rm
remove_all_extents.hpp
1885
0644
edit
dl
rm
remove_bounds.hpp
802
0644
edit
dl
rm
remove_const.hpp
1359
0644
edit
dl
rm
remove_cv.hpp
1794
0644
edit
dl
rm
remove_cv_ref.hpp
859
0644
edit
dl
rm
remove_extent.hpp
1791
0644
edit
dl
rm
remove_pointer.hpp
2203
0644
edit
dl
rm
remove_reference.hpp
1783
0644
edit
dl
rm
remove_volatile.hpp
1398
0644
edit
dl
rm
same_traits.hpp
586
0644
edit
dl
rm
transform_traits.hpp
893
0644
edit
dl
rm
type_identity.hpp
636
0644
edit
dl
rm
type_with_alignment.hpp
10037
0644
edit
dl
rm
Edit:
/usr/include/boost/type_traits/is_convertible.hpp
(18672B)
// Copyright 2000 John Maddock (john@johnmaddock.co.uk) // Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu) // Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) // // 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). // // See http://www.boost.org/libs/type_traits for most recent version including documentation. #ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED #define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED #include <boost/type_traits/intrinsics.hpp> #include <boost/type_traits/integral_constant.hpp> #include <boost/type_traits/is_complete.hpp> #include <boost/type_traits/is_void.hpp> #include <boost/type_traits/is_array.hpp> #include <boost/static_assert.hpp> #ifndef BOOST_IS_CONVERTIBLE #include <boost/type_traits/detail/yes_no_type.hpp> #include <boost/type_traits/detail/config.hpp> #include <boost/type_traits/is_array.hpp> #include <boost/type_traits/is_arithmetic.hpp> #include <boost/type_traits/is_void.hpp> #if !defined(BOOST_NO_IS_ABSTRACT) #include <boost/type_traits/is_abstract.hpp> #endif #include <boost/type_traits/add_lvalue_reference.hpp> #include <boost/type_traits/add_rvalue_reference.hpp> #include <boost/type_traits/is_function.hpp> #if defined(__MWERKS__) #include <boost/type_traits/remove_reference.hpp> #endif #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) # include <boost/type_traits/declval.hpp> #endif #elif defined(BOOST_MSVC) || defined(BOOST_INTEL) #include <boost/type_traits/is_function.hpp> #include <boost/type_traits/is_same.hpp> #endif // BOOST_IS_CONVERTIBLE namespace boost { #ifndef BOOST_IS_CONVERTIBLE // is one type convertible to another? // // there are multiple versions of the is_convertible // template, almost every compiler seems to require its // own version. // // Thanks to Andrei Alexandrescu for the original version of the // conversion detection technique! // namespace detail { #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !(defined(BOOST_GCC) && (BOOST_GCC < 40700)) // This is a C++11 conforming version, place this first and use it wherever possible: # define BOOST_TT_CXX11_IS_CONVERTIBLE template <class A, class B, class C> struct or_helper { static const bool value = (A::value || B::value || C::value); }; template<typename From, typename To, bool b = or_helper<boost::is_void<From>, boost::is_function<To>, boost::is_array<To> >::value> struct is_convertible_basic_impl { // Nothing converts to function or array, but void converts to void: static const bool value = is_void<To>::value; }; template<typename From, typename To> class is_convertible_basic_impl<From, To, false> { typedef char one; typedef int two; template<typename To1> static void test_aux(To1); template<typename From1, typename To1> static decltype(test_aux<To1>(boost::declval<From1>()), one()) test(int); template<typename, typename> static two test(...); public: static const bool value = sizeof(test<From, To>(0)) == 1; }; #elif defined(BOOST_BORLANDC) && (BOOST_BORLANDC < 0x560) // // special version for Borland compilers // this version breaks when used for some // UDT conversions: // template <typename From, typename To> struct is_convertible_impl { #pragma option push -w-8074 // This workaround for Borland breaks the EDG C++ frontend, // so we only use it for Borland. template <typename T> struct checker { static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T); }; static typename add_lvalue_reference<From>::type _m_from; static bool const value = sizeof( checker<To>::_m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type); #pragma option pop }; #elif defined(__GNUC__) || defined(BOOST_BORLANDC) && (BOOST_BORLANDC < 0x600) // special version for gcc compiler + recent Borland versions // note that this does not pass UDT's through (...) struct any_conversion { template <typename T> any_conversion(const volatile T&); template <typename T> any_conversion(const T&); template <typename T> any_conversion(volatile T&); template <typename T> any_conversion(T&); }; template <typename T> struct checker { static boost::type_traits::no_type _m_check(any_conversion ...); static boost::type_traits::yes_type _m_check(T, int); }; template <typename From, typename To> struct is_convertible_basic_impl { typedef typename add_lvalue_reference<From>::type lvalue_type; typedef typename add_rvalue_reference<From>::type rvalue_type; static lvalue_type _m_from; #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6))) static bool const value = sizeof( boost::detail::checker<To>::_m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type); #else static bool const value = sizeof( boost::detail::checker<To>::_m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type); #endif }; #elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \ || defined(__IBMCPP__) || defined(__HP_aCC) // // This is *almost* an ideal world implementation as it doesn't rely // on undefined behaviour by passing UDT's through (...). // Unfortunately it doesn't quite pass all the tests for most compilers (sigh...) // Enable this for your compiler if is_convertible_test.cpp will compile it... // // Note we do not enable this for VC7.1, because even though it passes all the // type_traits tests it is known to cause problems when instantiation occurs // deep within the instantiation tree :-( // struct any_conversion { template <typename T> any_conversion(const volatile T&); template <typename T> any_conversion(const T&); template <typename T> any_conversion(volatile T&); // we need this constructor to catch references to functions // (which can not be cv-qualified): template <typename T> any_conversion(T&); }; template <typename From, typename To> struct is_convertible_basic_impl { static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); typedef typename add_lvalue_reference<From>::type lvalue_type; typedef typename add_rvalue_reference<From>::type rvalue_type; static lvalue_type _m_from; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type) ); #else BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) ); #endif }; #elif defined(__DMC__) struct any_conversion { template <typename T> any_conversion(const volatile T&); template <typename T> any_conversion(const T&); template <typename T> any_conversion(volatile T&); // we need this constructor to catch references to functions // (which can not be cv-qualified): template <typename T> any_conversion(T&); }; template <typename From, typename To> struct is_convertible_basic_impl { // Using '...' doesn't always work on Digital Mars. This version seems to. template <class T> static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion, float, T); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int); typedef typename add_lvalue_reference<From>::type lvalue_type; typedef typename add_rvalue_reference<From>::type rvalue_type; static lvalue_type _m_from; // Static constants sometime cause the conversion of _m_from to To to be // called. This doesn't happen with an enum. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES enum { value = sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0, 0) ) == sizeof(::boost::type_traits::yes_type) }; #else enum { value = sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type) }; #endif }; #elif defined(__MWERKS__) // // CW works with the technique implemented above for EDG, except when From // is a function type (or a reference to such a type), in which case // any_conversion won't be accepted as a valid conversion. We detect this // exceptional situation and channel it through an alternative algorithm. // template <typename From, typename To,bool FromIsFunctionRef> struct is_convertible_basic_impl_aux; struct any_conversion { template <typename T> any_conversion(const volatile T&); template <typename T> any_conversion(const T&); template <typename T> any_conversion(volatile T&); template <typename T> any_conversion(T&); }; template <typename From, typename To> struct is_convertible_basic_impl_aux<From,To,false /*FromIsFunctionRef*/> { static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); typedef typename add_lvalue_reference<From>::type lvalue_type; typedef typename add_rvalue_reference<From>::type rvalue_type; static lvalue_type _m_from; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type) ); #else BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) ); #endif }; template <typename From, typename To> struct is_convertible_basic_impl_aux<From,To,true /*FromIsFunctionRef*/> { static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); typedef typename add_lvalue_reference<From>::type lvalue_type; typedef typename add_rvalue_reference<From>::type rvalue_type; static lvalue_type _m_from; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type) ); #else BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) ); #endif }; template <typename From, typename To> struct is_convertible_basic_impl: is_convertible_basic_impl_aux< From,To, ::boost::is_function<typename ::boost::remove_reference<From>::type>::value > {}; #else // // This version seems to work pretty well for a wide spectrum of compilers, // however it does rely on undefined behaviour by passing UDT's through (...). // //Workaround for old compilers like MSVC 7.1 to avoid //forming a reference to an array of unknown bound template <typename From> struct is_convertible_basic_impl_add_lvalue_reference : add_lvalue_reference<From> {}; template <typename From> struct is_convertible_basic_impl_add_lvalue_reference<From[]> { typedef From type []; }; template <typename From, typename To> struct is_convertible_basic_impl { static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); typedef typename is_convertible_basic_impl_add_lvalue_reference<From>::type lvalue_type; static lvalue_type _m_from; #ifdef BOOST_MSVC #pragma warning(push) #pragma warning(disable:4244) #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000) #pragma warning(disable:6334) #endif #endif #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES typedef typename add_rvalue_reference<From>::type rvalue_type; BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type) ); #else BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) ); #endif #ifdef BOOST_MSVC #pragma warning(pop) #endif }; #endif // is_convertible_impl #if defined(__DMC__) // As before, a static constant sometimes causes errors on Digital Mars. template <typename From, typename To> struct is_convertible_impl { enum { value = ( ::boost::detail::is_convertible_basic_impl<From,To>::value && ! ::boost::is_array<To>::value && ! ::boost::is_function<To>::value) }; }; #elif !defined(BOOST_BORLANDC) || BOOST_BORLANDC > 0x551 template <typename From, typename To> struct is_convertible_impl { BOOST_STATIC_CONSTANT(bool, value = ( ::boost::detail::is_convertible_basic_impl<From, To>::value && !::boost::is_array<To>::value && !::boost::is_function<To>::value)); }; #endif template <bool trivial1, bool trivial2, bool abstract_target> struct is_convertible_impl_select { template <class From, class To> struct rebind { typedef is_convertible_impl<From, To> type; }; }; template <> struct is_convertible_impl_select<true, true, false> { template <class From, class To> struct rebind { typedef true_type type; }; }; template <> struct is_convertible_impl_select<false, false, true> { template <class From, class To> struct rebind { typedef false_type type; }; }; template <> struct is_convertible_impl_select<true, false, true> { template <class From, class To> struct rebind { typedef false_type type; }; }; template <typename From, typename To> struct is_convertible_impl_dispatch_base { #if !BOOST_WORKAROUND(__HP_aCC, < 60700) typedef is_convertible_impl_select< ::boost::is_arithmetic<From>::value, ::boost::is_arithmetic<To>::value, #if !defined(BOOST_NO_IS_ABSTRACT) && !defined(BOOST_TT_CXX11_IS_CONVERTIBLE) // We need to filter out abstract types, only if we don't have a strictly conforming C++11 version: ::boost::is_abstract<To>::value #else false #endif > selector; #else typedef is_convertible_impl_select<false, false, false> selector; #endif typedef typename selector::template rebind<From, To> isc_binder; typedef typename isc_binder::type type; }; template <typename From, typename To> struct is_convertible_impl_dispatch : public is_convertible_impl_dispatch_base<From, To>::type {}; // // Now add the full and partial specialisations // for void types, these are common to all the // implementation above: // #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS template <> struct is_convertible_impl_dispatch<void, void> : public true_type{}; template <> struct is_convertible_impl_dispatch<void, void const> : public true_type{}; template <> struct is_convertible_impl_dispatch<void, void const volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void, void volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const, void> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const, void const> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const, void const volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const, void volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const volatile, void> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const volatile, void const> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const volatile, void const volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void const volatile, void volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void volatile, void> : public true_type{}; template <> struct is_convertible_impl_dispatch<void volatile, void const> : public true_type{}; template <> struct is_convertible_impl_dispatch<void volatile, void const volatile> : public true_type{}; template <> struct is_convertible_impl_dispatch<void volatile, void volatile> : public true_type{}; #else template <> struct is_convertible_impl_dispatch<void, void> : public true_type{}; #endif // BOOST_NO_CV_VOID_SPECIALIZATIONS template <class To> struct is_convertible_impl_dispatch<void, To> : public false_type{}; template <class From> struct is_convertible_impl_dispatch<From, void> : public false_type{}; #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS template <class To> struct is_convertible_impl_dispatch<void const, To> : public false_type{}; template <class From> struct is_convertible_impl_dispatch<From, void const> : public false_type{}; template <class To> struct is_convertible_impl_dispatch<void const volatile, To> : public false_type{}; template <class From> struct is_convertible_impl_dispatch<From, void const volatile> : public false_type{}; template <class To> struct is_convertible_impl_dispatch<void volatile, To> : public false_type{}; template <class From> struct is_convertible_impl_dispatch<From, void volatile> : public false_type{}; #endif } // namespace detail template <class From, class To> struct is_convertible : public integral_constant<bool, ::boost::detail::is_convertible_impl_dispatch<From, To>::value> { BOOST_STATIC_ASSERT_MSG(boost::is_complete<To>::value || boost::is_void<To>::value || boost::is_array<To>::value, "Destination argument type to is_convertible must be a complete type"); BOOST_STATIC_ASSERT_MSG(boost::is_complete<From>::value || boost::is_void<From>::value || boost::is_array<From>::value, "From argument type to is_convertible must be a complete type"); }; #else template <class From, class To> struct is_convertible : public integral_constant<bool, BOOST_IS_CONVERTIBLE(From, To)> { #if BOOST_WORKAROUND(BOOST_MSVC, <= 1900) BOOST_STATIC_ASSERT_MSG(boost::is_complete<From>::value || boost::is_void<From>::value || boost::is_array<From>::value || boost::is_reference<From>::value, "From argument type to is_convertible must be a complete type"); #endif #if defined(__clang__) // clang's intrinsic doesn't assert on incomplete types: BOOST_STATIC_ASSERT_MSG(boost::is_complete<To>::value || boost::is_void<To>::value || boost::is_array<To>::value, "Destination argument type to is_convertible must be a complete type"); BOOST_STATIC_ASSERT_MSG(boost::is_complete<From>::value || boost::is_void<From>::value || boost::is_array<From>::value, "From argument type to is_convertible must be a complete type"); #endif }; #endif } // namespace boost #endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
Save
cmd:
run