《STL 원본 분석 》 노트:traits 기술
template
struct my_is_void
{
static const bool value = false;
};
template <>
struct my_is_void
{
static const bool value = true;
};
cout << my_is_void::value << endl;
cout << my_is_void::value << endl;
위의 이 예는 템플릿 편특화와 클래스 정적 변수를 이용하여 유형에 대한 공형 여부를 판단하는 예이다.template
void func(Iterator iter)
{
// ?
*iter var // 。
}
//
template
void func(Iterator iter)
{
__func(&*iter);
}
template
void __func(T* )
{
T var;
}
template
inline void destory(ForwardIterator first, ForwardIterator last)
{
if (is_POD_type(*first))
; // int POD_type , 。
if (is_no_POD_type(*first))
for (; first != last; first++)
first->~(*first)() // ,(*first) 。
}
를 분석하는 것이 목적이지만 is POD type과 is no POD type 두 가지 뜻을 어떻게 표현합니까? 이럴 때 우리는 내장형과 편특화로 실현할 수 있습니다.//
struct _true_type { };
struct _false_type { };
// POD_type
template
struct _type_traits
{
typedef _false_type has_trivial_default_constructor;
typedef _false_type has_trivial_copy_constructor;
typedef _false_type has_trivial_assignment_operator;
typedef _false_type has_trivial_destructor;
typedef _false_type is_POD_type;
};
// char
template<>
struct _type_traits
{
typedef _true_type has_trivial_default_constructor;
typedef _true_type has_trivial_copy_constructor;
typedef _true_type has_trivial_assignment_operator;
typedef _true_type has_trivial_destructor;
typedef _true_type is_POD_type;
};
// int
template<>
struct _type_traits
{
typedef _true_type has_trivial_default_constructor;
typedef _true_type has_trivial_copy_constructor;
typedef _true_type has_trivial_assignment_operator;
typedef _true_type has_trivial_destructor;
typedef _true_type is_POD_type;
};
...... POD 。
// non trivaial destructor。
template
inline void destory(ForwardIterator first, ForwardIterator last)
{
/* _type_traits */
typedef typename _type_traits::is_POD_type is_POD_type;
__destory_aux(first, last, is_POD_type());
}
// trivial destructor,
template
inline void __destory_aux
(ForwardIterator first, ForwardIterator last, _true_type)
{
}
// non trivial destrouctor, destroy
template
inline void __destory_aux(ForwardIterator first, ForwardIterator last,
_false_type)
{
for (; first != last; ++first)
destory(&*first);
}
// destroy
template
inline void destory(T* pointer)
{
pointer->~T();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.