Boost學習筆記之type_traits(一)

//筆記 實現代碼 僅摘取一部分 理解原理 不是完整的boost代碼


//1.add_const
   // 依賴的頭文件
   // #include <boost/type_traits/add_const.hpp> or #include <boost/type_traits.hpp>
   // 實現原理
   template <class T> struct add_const
   {
      typedef T const type;
   };

   template <class T> struct add_const<T&>
   {
      typedef T& type;
   };

   // add_const<int>::type                    =>  int const 
   // add_const<int&>::type                   =>  int&
   // add_const<int*>::type                   =>  int* const 
   // add_const<int const>::type              =>  int const

//2.add_cv
   // 依賴的頭文件
   // #include <boost/type_traits/add_cv.hpp> or #include <boost/type_traits.hpp>

   template <class T> struct add_cv{ typedef T const volatile type; };

   template <class T> struct add_cv<T&>{ typedef T& type; };

   // add_cv<int>::type                       =>  int const volatile
   // add_cv<int&>::type                      =>  int&
   // add_cv<int*>::type                      =>  int* const volatile
   // add_cv<int const>::type                 =>  int const volatile

//3.add_reference
   // 依賴的頭文件
   // #include <boost/type_traits/add_reference.hpp> or #include <boost/type_traits.hpp>
   template <typename T>
   struct add_reference_impl
   {
      typedef T& type;
   };

   template <typename T>
   struct add_reference_impl<T&&>
   {
      typedef T&& type;
   };

   template <class T> struct add_reference
   {
      typedef typename add_reference_impl<T>::type type;
   };
   template <class T> struct add_reference<T&>
   {
      typedef T& type;
   };
   template <> struct add_reference<void> { typedef void type; };

   template <> struct add_reference<const void> { typedef const void type; };
   template <> struct add_reference<const volatile void> { typedef const volatile void type; };
   template <> struct add_reference<volatile void> { typedef volatile void type; };

   // add_reference<int>::type               =>  int&
   // add_reference<int const&>::type        =>  int const& 
   // add_reference<int*>::type              =>  int*&
   // add_reference<int*&>::type             =>  int*&

//4.add_volatile
   // 依賴的頭文件
   // #include <boost/type_traits/add_volatile.hpp> or #include <boost/type_traits.hpp>
   
   template <class T> struct add_volatile{ typedef T volatile type; };

   template <class T> struct add_volatile<T&>{ typedef T& type; };

   // add_volatile<int>::type               => int volatile
   // add_volatile<int&>::type              => int&
   // add_volatile<int*>::type              => int* volatile
   // add_volatile<int const>::type         => int const volatile
//5.add_pointer
   // 依賴的頭文件
   // #include <boost/type_traits/add_pointer.hpp> or #include <boost/type_traits.hpp>

   template <typename T>
   struct add_pointer
   {
      typedef T* type;
   };
   template <typename T>
   struct add_pointer<T&>
   {
      typedef T* type;
   };
   template <typename T>
   struct add_pointer<T&const>
   {
      typedef T* type;
   };
   template <typename T>
   struct add_pointer<T&volatile>
   {
      typedef T* type;
   };
   template <typename T>
   struct add_pointer<T&const volatile>
   {
      typedef T* type;
   };
   // add_pointer<int>::type                => int*
   // add_pointer<int const&>::type         => int const*
   // add_pointer<int*>::type               => int**
   // add_pointer<int*&>::type              => int**
//6.add_lvalue_reference
   // 依賴的頭文件
   // #include <boost/type_traits/add_lvalue_reference.hpp> or #include <boost/type_traits.hpp>
   template <class T> struct add_lvalue_reference
   {
      typedef typename add_reference<T>::type type; 
   };

   template <class T> struct add_lvalue_reference<T&&>
   {
      typedef T& type;
   };
   // add_lvalue_reference<int>::type              => int&
   // add_lvalue_reference<int const&>::type       => int const&
   // add_lvalue_reference<int*>::type             => int*&
   // add_lvalue_reference<int*&>::type            => int*&
   // add_lvalue_reference<int&&>::type            => int&
   // add_lvalue_reference<void>::type             => void        

//7.add_rvalue_reference
   // 依賴的頭文件
   // #include <boost/type_traits/add_rvalue_reference.hpp> or #include <boost/type_traits.hpp>
   template <typename T, bool b>
   struct add_rvalue_reference_helper
   { typedef T   type; };


   template <typename T>
   struct add_rvalue_reference_helper<T, true>
   {
      typedef T&&   type;
   };

   template <typename T>
   struct add_rvalue_reference_imp
   {
      typedef typename add_rvalue_reference_helper
                  <T, (is_void<T>::value == false && is_reference<T>::value == false) >::type type;
   };

   template <class T> struct add_rvalue_reference
   {
      typedef typename add_rvalue_reference_imp<T>::type type;
   };

   // add_rvalue_reference<int>::type              => int&&
   // add_rvalue_reference<int const&>::type       => int const&
   // add_rvalue_reference<int*>::type             => int*&&
   // add_rvalue_reference<int*&>::type            => int*&
   // add_rvalue_reference<int&&>::type            => int&&
   // add_rvalue_reference<void>::type             => void


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章