2013-04-21 STL之模板编程技巧
2013-04-22 00:12
316 查看
C++编程最重要的一个范型编程,可惜工作中还少用到,不过还好STL源码编程中所以的东西都是模板编程,弥补了这一块的不足,同时也让我学到很多技巧。
1、 迭代器概念与traits编程技法
template<class Iterator>
struct iterator_traits{
typedef typename Iterator::iterator_category
iterator_category;
typedef typename Iterator::value_type
value_type;
typedef typename Iterator::difference_type
difference_type;
typedef typename Iterator::pointer
pointer;
typedef typename Iterator::reference
reference;
};
以下为偏特化版
template<class T>
struct iteraotr_traits<T*>
{
typedef random_access_iterator_tag
iterator_category;
typedef T
value_type;
typedef ptrdiff_t
difference_type;
typedef T*
pointer;
typedef T&
reference;
};
template<class T>
struct iteraotr_traits<const T*>
{
typedef random_access_iterator_tag
iterator_category;
typedef
T value_type;
typedef ptrdiff_t
pointer;
typedef const T*
pointer;
typedef const T& reference;
};
一般内置数据类型通过第一种模板就可以实现,但是像原生指针时,有一些部件就没有用了,如value_type,这时就需要使用模板的偏特化的特性,
我理解的偏特化就是程序对一些特定的类型的一些特殊处理,但是这个特殊处理可以省去我们很多事,
以后我们就可以很方便的使用其中的变量。如value_type
typedef typename iterator_traits<Iterator>::value_type 而不用担心iterator到底是什么类型
traits 的编程技法很棒,适度的弥补了C++语言本身的不足,下面来看看另外一种用法,
type_traits
STL 编程时是很注重性能的,所以当stl删除一个对象的时候,会先判断一个对象是否具备non-trivial dtor,
如果答案是否定的,那么stl就可以直接使用malloc、memcpy这些效率极高的函数,而不用去调用哪些没用的构造、析构函数,
但是C++本身并没有类型判断,所以就就可以借助traits的编程技巧。
struct _true_type{};
struct _false_type{};
这两个空白classes没有任何成员,不会带来额外负担,却又能表示真假,
class 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;
};
所有的内嵌类型都被定义成了_false_type,这是定义的保守值。下面我们对每一个标量型别设计适当的_type_traits
STL_TEMPLATE_NULL 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;
};
STL_TEMPLATE_NULL 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;
};
STL_TEMPLATE_NULL 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;
};
......
这里就不一一列举了
看这个的用法
void temp_test(_false_type){cout<<"_false_type"<<endl;}
void temp_test(_true_type) {cout<<"_true_type"<<endl;}
template<class T>
void func_test(T a)
{
typedef typename _type_traits<T>::is_POD_type is_POD;
temp_test(is_POD());
}
class Test
{};
int main()
{
Test temp_a;
int a;
func_test(a);
func_test(temp_a);
}
输出的结果是:
_false_type
_true_type
可以看出,这个用法是很简单的,而且用到其他地方,如STL就用它来判断用构造的和析构的对象是否可以直接memcpy和delete,
可以得到很大的性能。
1、 迭代器概念与traits编程技法
template<class Iterator>
struct iterator_traits{
typedef typename Iterator::iterator_category
iterator_category;
typedef typename Iterator::value_type
value_type;
typedef typename Iterator::difference_type
difference_type;
typedef typename Iterator::pointer
pointer;
typedef typename Iterator::reference
reference;
};
以下为偏特化版
template<class T>
struct iteraotr_traits<T*>
{
typedef random_access_iterator_tag
iterator_category;
typedef T
value_type;
typedef ptrdiff_t
difference_type;
typedef T*
pointer;
typedef T&
reference;
};
template<class T>
struct iteraotr_traits<const T*>
{
typedef random_access_iterator_tag
iterator_category;
typedef
T value_type;
typedef ptrdiff_t
pointer;
typedef const T*
pointer;
typedef const T& reference;
};
一般内置数据类型通过第一种模板就可以实现,但是像原生指针时,有一些部件就没有用了,如value_type,这时就需要使用模板的偏特化的特性,
我理解的偏特化就是程序对一些特定的类型的一些特殊处理,但是这个特殊处理可以省去我们很多事,
以后我们就可以很方便的使用其中的变量。如value_type
typedef typename iterator_traits<Iterator>::value_type 而不用担心iterator到底是什么类型
traits 的编程技法很棒,适度的弥补了C++语言本身的不足,下面来看看另外一种用法,
type_traits
STL 编程时是很注重性能的,所以当stl删除一个对象的时候,会先判断一个对象是否具备non-trivial dtor,
如果答案是否定的,那么stl就可以直接使用malloc、memcpy这些效率极高的函数,而不用去调用哪些没用的构造、析构函数,
但是C++本身并没有类型判断,所以就就可以借助traits的编程技巧。
struct _true_type{};
struct _false_type{};
这两个空白classes没有任何成员,不会带来额外负担,却又能表示真假,
class 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;
};
所有的内嵌类型都被定义成了_false_type,这是定义的保守值。下面我们对每一个标量型别设计适当的_type_traits
STL_TEMPLATE_NULL 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;
};
STL_TEMPLATE_NULL 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;
};
STL_TEMPLATE_NULL 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;
};
......
这里就不一一列举了
看这个的用法
void temp_test(_false_type){cout<<"_false_type"<<endl;}
void temp_test(_true_type) {cout<<"_true_type"<<endl;}
template<class T>
void func_test(T a)
{
typedef typename _type_traits<T>::is_POD_type is_POD;
temp_test(is_POD());
}
class Test
{};
int main()
{
Test temp_a;
int a;
func_test(a);
func_test(temp_a);
}
输出的结果是:
_false_type
_true_type
可以看出,这个用法是很简单的,而且用到其他地方,如STL就用它来判断用构造的和析构的对象是否可以直接memcpy和delete,
可以得到很大的性能。
相关文章推荐
- C++类模板与STL编程
- STl-traits编程技巧
- STL中迭代器与traits编程的技巧
- 【编程技巧】头文件不能定义全局变量+模板的实现应该头文件中
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。
- STL源码解析——traits(特性)编程技巧
- stl模板编程模板参数推导
- C++STL 编程技巧1 STL中各种排序算法的实现
- [唐胡璐]QTP技巧 - 为描述性编程自动创建注释(Action 模板)
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。+string +dfs +bfs等重要算法
- STL中的traits编程技巧
- STL中,traits编程技法+模板
- [唐胡璐]QTP技巧 - 为描述性编程自动创建注释(Action 模板)
- STL中实现 iterator trail 的编程技巧
- STL中的Traits编程技巧
- STL学习笔记:Iterator和Traits编程技巧
- 模板编程之技巧(一)
- 模板编程中的技巧
- vc编程技巧总结
- Delphi数据库编程技巧