2018年11月8日 星期四

[C++ Meta-programming] 實作將 reference 型別加上 const 的 metafunction


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <type_traits>
#include <iostream>

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

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

template <typename T>
struct add_const_ref2 : std::conditional<std::is_reference<T>::value,
                                        T,
                                        const T&>
{

};

int main()
{
    std::cout << std::is_same<add_const_ref<int&>::type, int&>::value << std::endl;
    std::cout << std::is_same<add_const_ref<int>::type, const int&>::value << std::endl;

    std::cout << std::is_same<add_const_ref2<int&>::type, int&>::value << std::endl;
    std::cout << std::is_same<add_const_ref2<int>::type, const int&>::value << std::endl;
}

思考脈絡

  • Primary template
    • 一般情況,定義一個新型別在 add_const_ref 內
    • 根據傳入型別 T 直接加上 const 和 &
  • Partial specialization
    • 遇到傳入型別是 reference 就走這個 case
    • 根據傳入型別 T,直接加上&,定義一個 T&


沒有留言:

張貼留言