程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11 type_traits 之is_pointer,is_member_function_pointer源碼分析,functionpointer

C++11 type_traits 之is_pointer,is_member_function_pointer源碼分析,functionpointer

編輯:C++入門知識

C++11 type_traits 之is_pointer,is_member_function_pointer源碼分析,functionpointer


源碼如下:

  template<typename>
    struct __is_pointer_helper
    : public false_type { };

  template<typename _Tp>
    struct __is_pointer_helper<_Tp*>
    : public true_type { };

  /// is_pointer
  template<typename _Tp>
    struct is_pointer
    : public integral_constant<bool, (__is_pointer_helper<typename
                      remove_cv<_Tp>::type>::value)>
    { };

 首先,定義了兩個類型,一個true_type和一個false_type這兩個值均繼承integral_constant。這兩個類型幾乎被所有的is_xxx復用啦。而且標准庫也提供給我們使用。

 然後,模板偏特化,指針類型的版本繼承true_type,非指針類型的版本繼承了false_type。

 

 1   /// integral_constant
 2   template<typename _Tp, _Tp __v>
 3     struct integral_constant
 4     {
 5       static constexpr _Tp                  value = __v;
 6       typedef _Tp                           value_type;
 7       typedef integral_constant<_Tp, __v>   type;
 8       constexpr operator value_type() { return value; }
 9     };
10   
11   template<typename _Tp, _Tp __v>
12     constexpr _Tp integral_constant<_Tp, __v>::value;
13 
14   /// The type used as a compile-time boolean with true value.
15   typedef integral_constant<bool, true>     true_type;
16 
17   /// The type used as a compile-time boolean with false value.
18   typedef integral_constant<bool, false>    false_type;
19  template<typename>
20     struct __is_member_function_pointer_helper
21     : public false_type { };
22 
23   template<typename _Tp, typename _Cp>
24     struct __is_member_function_pointer_helper<_Tp _Cp::*>
25     : public integral_constant<bool, is_function<_Tp>::value> { };
26 
27   /// is_member_function_pointer
28   template<typename _Tp>
29     struct is_member_function_pointer
30     : public integral_constant<bool, (__is_member_function_pointer_helper<
31                       typename remove_cv<_Tp>::type>::value)>
32     { };

成員指針,稍微復雜一點,和一般指針類似,成員指針的偏特化要寫成這樣_Tp _Cp::*。

 // Primary template.
  /// Define a member typedef @c type to one of two argument types.
  template<bool _Cond, typename _Iftrue, typename _Iffalse>
    struct conditional
    { typedef _Iftrue type; };

  // Partial specialization for false.
  template<typename _Iftrue, typename _Iffalse>
    struct conditional<false, _Iftrue, _Iffalse>
    { typedef _Iffalse type; };

 conditional機制類似於loki中的Select,根據boolean值來選擇類型,如果_Cond為true,則選擇_Iftrue類型,否則選擇另一個。

  /// is_reference
  template<typename _Tp>
    struct is_reference
    : public __or_<is_lvalue_reference<_Tp>,
                   is_rvalue_reference<_Tp>>::type
    { };

 is_reference通過or結合左值引用和右值引用判斷。

 template<typename...>
    struct __or_;

  template<>
    struct __or_<>
    : public false_type
    { };

  template<typename _B1>
    struct __or_<_B1>
    : public _B1
    { };

  template<typename _B1, typename _B2>
    struct __or_<_B1, _B2>
    : public conditional<_B1::value, _B1, _B2>::type
    { };

  template<typename _B1, typename _B2, typename _B3, typename... _Bn>
    struct __or_<_B1, _B2, _B3, _Bn...>
    : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
    { };

 1.or繼承conditional所提供的類型而不是conditional本身。

 2.conditional通過or中第一類型boolean來提供不同的類型,如果B1的boolean是true則繼承(也表明B1繼承了true_type),不是則繼承剩余參數or(遞歸繼承下去)。

 3.遞歸下去,就剩下一個類型時,則直接繼承B1,B1的boolean就是整個or的結果

 4.遞歸到末尾空參數,繼承false_type,整個or的結果即為false。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved