且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

VC6下实现remove_reference的方法。

更新时间:2022-09-16 14:43:02

6对模板的支持很差,有人断言VC6下不可能实现通用的remove_reference。我参考了boost,摘录其中的部分,实现了VC6下可运行的remove_reference。
 
核心代码如下:
 
VC6下实现remove_reference的方法。//remove_reference.h 
VC6下实现remove_reference的方法。#ifndef _REMOVE_REFERENCE_H_ 
VC6下实现remove_reference的方法。#define _REMOVE_REFERENCE_H_ 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。namespace boost { 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。namespace type_traits { 
VC6下实现remove_reference的方法。     
VC6下实现remove_reference的方法。    template <class T> struct wrap {}; 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。    typedef char yes_type; 
VC6下实现remove_reference的方法。    struct no_type 
VC6下实现remove_reference的方法。    { 
VC6下实现remove_reference的方法。      char padding[8]; 
VC6下实现remove_reference的方法。    }; 
VC6下实现remove_reference的方法。     
VC6下实现remove_reference的方法。}// namespace boost::type_traits 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。namespace detail { 
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  using ::boost::type_traits::yes_type; 
VC6下实现remove_reference的方法。  using ::boost::type_traits::no_type; 
VC6下实现remove_reference的方法。  using ::boost::type_traits::wrap; 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(trait,sp,C) \ 
VC6下实现remove_reference的方法。  template<> struct trait##_impl< sp > \ 
VC6下实现remove_reference的方法。  { \ 
VC6下实现remove_reference的方法。  enum {value = (C)}; \ 
VC6下实现remove_reference的方法。  };    
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  template <class T> T&(* is_reference_helper1(wrap<T>) )(wrap<T>); 
VC6下实现remove_reference的方法。  char is_reference_helper1(...); 
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  template <class T> no_type is_reference_helper2(T&(*)(wrap<T>)); 
VC6下实现remove_reference的方法。  yes_type is_reference_helper2(...); 
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  template <typename T> 
VC6下实现remove_reference的方法。    struct is_reference_impl 
VC6下实现remove_reference的方法。  { 
VC6下实现remove_reference的方法。    enum
VC6下实现remove_reference的方法。      value = sizeof
VC6下实现remove_reference的方法。        ::boost::detail::is_reference_helper2( 
VC6下实现remove_reference的方法。        ::boost::detail::is_reference_helper1(::boost::type_traits::wrap<T>()))) == 1 
VC6下实现remove_reference的方法。    }; 
VC6下实现remove_reference的方法。    //      BOOST_STATIC_CONSTANT( 
VC6下实现remove_reference的方法。    //        bool, value = sizeof( 
VC6下实现remove_reference的方法。    //                         ::boost::detail::is_reference_helper2( 
VC6下实现remove_reference的方法。    //        ::boost::detail::is_reference_helper1(::boost::type_traits::wrap<T>()))) == 1 
VC6下实现remove_reference的方法。    //        ); 
VC6下实现remove_reference的方法。  }; 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void,false// VC6用这一个就可以了,void const等也解决了 
VC6下实现remove_reference的方法。//    #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS 
VC6下实现remove_reference的方法。//    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void const,false) 
VC6下实现remove_reference的方法。//    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void volatile,false) 
VC6下实现remove_reference的方法。//    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_reference,void const volatile,false) 
VC6下实现remove_reference的方法。//    #endif 
VC6下实现remove_reference的方法。     
VC6下实现remove_reference的方法。// namespace detail 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。template <typename T> 
VC6下实现remove_reference的方法。struct is_reference 
VC6下实现remove_reference的方法。
VC6下实现remove_reference的方法。  enum
VC6下实现remove_reference的方法。    value = detail::is_reference_impl<T>::value 
VC6下实现remove_reference的方法。  }; 
VC6下实现remove_reference的方法。}; 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。namespace detail { 
VC6下实现remove_reference的方法。  template<typename ID> 
VC6下实现remove_reference的方法。                struct msvc_extract_type 
VC6下实现remove_reference的方法。  { 
VC6下实现remove_reference的方法。    struct id2type; 
VC6下实现remove_reference的方法。  }; 
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  template<typename T, typename ID> 
VC6下实现remove_reference的方法。                struct msvc_register_type : msvc_extract_type<ID> 
VC6下实现remove_reference的方法。  { 
VC6下实现remove_reference的方法。    typedef msvc_extract_type<ID> base_type; 
VC6下实现remove_reference的方法。    struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature 
VC6下实现remove_reference的方法。    { 
VC6下实现remove_reference的方法。      typedef T type; 
VC6下实现remove_reference的方法。    }; 
VC6下实现remove_reference的方法。        }; 
VC6下实现remove_reference的方法。    
VC6下实现remove_reference的方法。  template<bool IsReference> 
VC6下实现remove_reference的方法。                struct remove_reference_impl_typeof { 
VC6下实现remove_reference的方法。    template<typename T,typename ID> 
VC6下实现remove_reference的方法。                        struct inner { 
VC6下实现remove_reference的方法。      typedef T type; 
VC6下实现remove_reference的方法。    }; 
VC6下实现remove_reference的方法。  }; 
VC6下实现remove_reference的方法。  template<> 
VC6下实现remove_reference的方法。                struct remove_reference_impl_typeof<true> { 
VC6下实现remove_reference的方法。    template<typename T,typename ID> 
VC6下实现remove_reference的方法。                        struct inner { 
VC6下实现remove_reference的方法。      template<typename U> 
VC6下实现remove_reference的方法。                                static msvc_register_type<U,ID> test(U&(*)()); 
VC6下实现remove_reference的方法。      static msvc_register_type<T,ID> test(...); 
VC6下实现remove_reference的方法。      //BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); 
VC6下实现remove_reference的方法。      enum {register_test=sizeof(test( (T(*)())(NULL) ) )}; 
VC6下实现remove_reference的方法。      typedef typename msvc_extract_type<ID>::id2type::type type; 
VC6下实现remove_reference的方法。    }; 
VC6下实现remove_reference的方法。  }; 
VC6下实现remove_reference的方法。//namespace detail 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。template<typename T> 
VC6下实现remove_reference的方法。struct remove_reference { 
VC6下实现remove_reference的方法。  typedef typename detail::remove_reference_impl_typeof< 
VC6下实现remove_reference的方法。    boost::is_reference<T>::value 
VC6下实现remove_reference的方法。                >::template inner<T,remove_reference<T> >::type type; 
VC6下实现remove_reference的方法。  //BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_reference,T) 
VC6下实现remove_reference的方法。        }; 
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。}    
VC6下实现remove_reference的方法。 
VC6下实现remove_reference的方法。#endif
















本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/sinojelly/100307,如需转载请自行联系原作者