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입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백 함수를 Angular 하위 구성 요소에 전달이 예제는 구성 요소에 함수를 전달하는 것과 관련하여 최근에 직면한 문제를 다룰 것입니다. 국가 목록을 제공하는 콤보 상자 또는 테이블 구성 요소. 지금까지 모든 것이 구성 요소 자체에 캡슐화되었으며 백엔드에 대한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.