C++11 type_traits의 is_pointer,is_member_function_pointer 원본 분석

8463 단어 function
소스 코드는 다음과 같습니다.
  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.orconditional이 제공하는 형식을 계승하는 것이지conditional 자체가 아닙니다.
 2.conditional은 or의 첫 번째 유형인 boolean을 통해 서로 다른 유형을 제공합니다. 만약에 B1의 boolean이true라면 계승합니다. (B1이true_type를 계승한 것을 나타냅니다.) 그렇지 않으면 나머지 매개 변수 or를 계승합니다.
 3.한 유형만 남으면 B1을 그대로 계승하고 B1의boolean은 전체 or의 결과이다
 4.마지막 빈 매개변수로 돌아가기 false_ 상속type, 전체 or의 결과는false입니다.

좋은 웹페이지 즐겨찾기