用Traits进行类别推导,将类别选择工作放到编译期进行,利用重载提高效率。
下面的type_traits.h是我直接从SGI STL里Copy出来的。。。
#ifndef TYPE_TRAITS_H
#define
TYPE_TRAITS_H
//
为了了重载确定那些类弄型是不用析构的SGI STl用了type_traits
//
并将一些Scale type进行特例化
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的实现
#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 : 定义控制台应用程序的入口点。
//
/**//*
* 模仿实现SGI STL中的内存工具
* 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;
} 实中用到的simple_alloc及sgi_allocator.h是上一篇随笔里的东西。。。