1 // Copyright (C) 2004 Peder Holt 2 // Use, modification and distribution is subject to the Boost Software 3 // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) 4 5 #ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 6 #define BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 7 8 #include <boost/type_traits/msvc/typeof.hpp> 9 #include <boost/type_traits/is_reference.hpp> 10 11 namespace boost { 12 namespace detail { 13 template<bool IsReference> 14 struct remove_reference_impl_typeof { 15 template<typename T,typename ID> 16 struct inner { 17 typedef T type; 18 }; 19 }; 20 template<> 21 struct remove_reference_impl_typeof<true> { 22 template<typename T,typename ID> 23 struct inner { 24 template<typename U> 25 static msvc_register_type<U,ID> test(U&(*)()); 26 static msvc_register_type<T,ID> test(...); 27 BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); 28 typedef typename msvc_extract_type<ID>::id2type::type type; 29 }; 30 }; 31 } //namespace detail 32 33 template<typename T> 34 struct remove_reference { 35 typedef typename boost::detail::remove_reference_impl_typeof< 36 boost::is_reference<T>::value 37 >::template inner<T,remove_reference<T> >::type type; 38 BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_reference,T) 39 }; 40 } //namespace boost 41 42 #endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 43