??????用Traits進(jìn)行類別推導(dǎo),將類別選擇工作放到編譯期進(jìn)行,利用重載提高效率。
??????下面的type_traits.h是我直接從SGI STL里Copy出來的。。。
#ifndef?TYPE_TRAITS_H
#define
?TYPE_TRAITS_H
//
為了了重載確定那些類弄型是不用析構(gòu)的SGI?STl用了type_traits
//
并將一些Scale?type進(jìn)行特例化
struct
?__true_type?
{
}
;


struct
?__false_type?
{
}
;

template?
<
class
?_Tp
>
struct
?__type_traits?
{?
???typedef?__true_type?????this_dummy_member_must_be_first;

???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;
}
;

template
<>
struct
?__type_traits
<
bool
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
char
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
signed?
char
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
unsigned?
char
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
wchar_t
>
?
{
???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;
}
;

template
<>
?
struct
?__type_traits
<
short
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
unsigned?
short
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
int
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
unsigned?
int
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
long
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
unsigned?
long
>
?
{
???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;
}
;

#ifdef?__STL_LONG_LONG
template
<>
?
struct
?__type_traits
<
long
?
long
>
?
{
???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;
}
;


?
struct
?__type_traits
<
unsigned?
long
?
long
>
?
{
???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;
}
;

#endif
?/*?__STL_LONG_LONG?*/
template
<>
?
struct
?__type_traits
<
float
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
double
>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
long
?
double
>
?
{
???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;
}
;

template?
<
class
?_Tp
>
struct
?__type_traits
<
_Tp
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
char
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
signed?
char
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
unsigned?
char
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
const
?
char
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
const
?signed?
char
*>
?
{
???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;
}
;
template
<>
?
struct
?__type_traits
<
const
?unsigned?
char
*>
?
{
???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;
}
;

#endif
以下是construct 和 destroy的實(shí)現(xiàn)
#ifndef?MEM_TOOlS_H
#define?MEM_TOOlS_H
#include?"type_traits.h"
using?namespace?std;
namespace?SGI


{
????template<typename?T1,?typename?T2>
????inline?void?construct(T1*?p,?const?T2&?value)

????
{
????????new(p)T1(value);
????}
????
????template<typename?T>
????inline?void?construct(T*?p)

????
{
????????new(p)T();
????}

????template<typename?T>
????void?destroy(T*?p)

????
{
????????p->~T();
????}

????template<typename?ForwardIterator>
????inline?void?destroy_aux(ForwardIterator?first,?ForwardIterator?last,?__false_type)

????
{
????????for?(;?first?<?last;?++first)
????????????destroy(&*first);

????????cout?<<?"false?type"?<<?endl;
????}

????template<typename?ForwardIterator>
????inline?void?destroy_aux(ForwardIterator?first,?ForwardIterator?last,?__true_type)

????
{
????????cout?<<?"true?type"?<<?endl;
????}

????template<typename?ForwardIterator>
????inline?void?destroy(ForwardIterator?first,?ForwardIterator?last)

????
{
????????_destroy(first,?last,?value_type(*first));
????}

????template<typename?ForwardIterator,?typename?T>
????inline?void?_destroy(ForwardIterator?first,?ForwardIterator?last,?T*)

????
{
????????typedef?__type_traits<T>::has_trivial_destructor?trivial_destructor;
????????destroy_aux(first,?last,?trivial_destructor());
????}

????inline?void?destroy(char*,?char*)?

????
{
????????cout?<<?"char*?type"?<<?endl;
????}
????inline?void?destroy(wchar_t*,?wchar_t*)?

????
{
????????cout?<<?"wchar_t*?type"?<<?endl;
????}????

}

#endif在main中對construct,destroy時行測試
//?mem_tools.cpp?:?定義控制臺應(yīng)用程序的入口點(diǎn)。
//

/**//*
?*????模仿實(shí)現(xiàn)SGI?STL中的內(nèi)存工具
?*??szwolf?@?szu
?*??2006.08.07
?*/
#include?"stdafx.h"
#include?"sgi_allocator.h"
#include?<iostream>
#include?<vector>
#include?<algorithm>
#include?"mem_tools.h"

class?mem_test


{
public:
????mem_test(const?char*?msg)

????
{
????????cout?<<?msg?<<?endl;
????}

????~mem_test()

????
{
????????cout?<<?"dead~~"?<<?endl;
????}
};

int?_tmain(int?argc,?_TCHAR*?argv[])


{
????//????很郁悶為什么下面的代碼是錯的?
????//????typedef?simple_alloc<mem_test,?SGI::alloc>?data_allcator;
????//????mem_test*?t?=?data_allocator::allocate();

????SGI::simple_alloc<mem_test,?SGI::alloc>?data_allocator;
????
????mem_test*?t?=?data_allocator.allocate();

????SGI::construct(t,?"come to live!");
????SGI::destroy(&*t);

????SGI::simple_alloc<char,?SGI::alloc>?char_alloc;
????char?*p?=?char_alloc.allocate(133);
????strcpy(p,?"hellow!");
????SGI::destroy(p,p+8);
????char_alloc.deallocate(p,?133);

????system("pause");
????return?0;
}實(shí)中用到的simple_alloc及sgi_allocator.h是上一篇隨筆里的東西。。。