//筆記 實現代碼 僅摘取一部分 理解原理 不是完整的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