template
InputIterator find(InputIterator first, InputIterator last,const T& value)
{while (first != last&&*first != value)++first;return first;
}
#include
#include
#include
#include
#include
{const int arraySize = 7;int ia[arraySize] = { 0,1,2,3,4,5,6 };vector
template
class auto_ptr
{
public:explicit auto_ptr(T* p = 0) :pointee(p) {}template
private:T* pointee;
};
int main()
{auto_ptr
template
class List
{
public:void insert_front(T value);void insert_end(T value);void display(std::ostream &os = std::cout)const;ListItem* end()const { return _end; }ListItem* front()const { return _front; }
private:ListItem
};template
class ListItem
{
public:T value()const { reutrn value; }ListItem* next()const { return return _next; }
private:T _value;ListItem* _next;
};
template
struct ListIter
{Item* ptr;ListIter(Item* p = 0) :ptr(p) {}Item& operator*()const { return *ptr; }Item* operator->()const { return ptr; }ListIter& operator++() { ptr = ptr->next();return *this;}ListIter& operator++(int) {ListIter tmp = *this;++*this;return tmp;}bool operator==(const ListIter& i)const { return ptr == i.ptr; }bool operator!=(const ListIter& i)const { return ptr != i.ptr; }
};
template
bool operator!=(const ListItem
{return (item->value() != n);
}
int main()
{List
template
void func_impl(I iter, T t)
{T tmp;//...
}template
inline void func(I iter)
{func_impl(iter, *iter);
}int main()
{int i;func(&i);
}
//迭代器类
template
struct MyIter {typedef T value_type; //内嵌类型别名,用value_type来表示迭代器类所指之物的类型T* ptr;MyIter(T* p = 0) :ptr(p) {}T& operator*()const { return *ptr; }
};/*为什么要使用typename:因为编译器不知道T是什么,也就是说编译器不知道MyIter
*/
template
typename I::value_type //一整行为func的返回值类型
func(I ite){return *ite;
}MyIter
cout <template
class C{};template
class C//偏特化迭代器类
template
struct MyIter
};
七、Traits编程技术 //如果I为迭代器类&#xff0c;并且迭代器类中声明有类型别名&#xff0c;那么我们就可以萃取出其中的数据类型template
struct iterator_traits {typedef typename I::value_type value_type;
};//萃取的使用场景
template
typename iterator_traits::value_type //一整行为func的返回值类型
func(I ite){return *ite;
}template
struct iterator_traits
};iterator_traits
template
struct iterator_traits
};
八、iterator_traits萃取机 //迭代器的源码
template
struct iterator {typedef Category iterator_category;typedef T value_type; //迭代器所指之物的数据类型(其余的见下面介绍)typedef Distance difference_type;typedef Pointer pointer;typedef Reference reference;
};//traits萃取机&#xff0c;其中I为迭代器类
template
struct iterator_traits {typedef typename I::iterator_category iterator_category;typedef typename I::value_type value_type;typedef typename I::difference_type difference_type;typedef typename I::pointer pointer;typedef typename I::reference reference;
};
九、迭代器相应类型之&#xff1a;value type
十、迭代器相应类型之&#xff1a;difference type template
typename iterator_traits::difference_type //函数的返回值类型
count(I first, I last, const T& value) {typename iterator_traits::difference n &#61; 0;for (; first !&#61; last; &#43;&#43;first)&#43;&#43;n;return n;
}//针对于原生指针的偏特化版本
template
struct iterator_traits
};//针对于pointer-to-const的偏特化版本
template
struct iterator_traits
};
十一、迭代器相应类型之&#xff1a;reference type template
struct iterator_traits {typedef typename I::reference reference;
};//针对于原生指针设计的偏特化版本
template
struct iterator_traits
};//针对于pointer-to-const设计的偏特化版本
template
struct iterator_traits
};
十二、迭代器相应类型之&#xff1a;pointer type template
struct iterator_traits {typedef typename I::pointer pointer;
};//针对于原生指针设计的偏特化版本
template
struct iterator_traits
};//针对于pointer-to-const设计的偏特化版本
template
struct iterator_traits
};
十三、迭代器相应类型之&#xff1a;iterator_category //用于标记迭代器的类型
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag :public input_iterator_tag {};
struct bidirectional_iterator_tag :public forward_iterator_tag {};
struct random_access_iterator_tag :public bidirectional_iterator_tag {};#include
struct D1 :public B {}; //D1模拟ForwardIterator
struct D2 :public D1 {};//D2模拟BidirectionalIteratortemplate
void func(I& p, B)
{std::cout <<"B version" <
void func(I& p, D2)
{std::cout <<"D2 version" <
{int *p;func(p, B()); //参数匹配&#xff0c;输出“B version”func(p, D1()); //参数不匹配&#xff0c;因继承关系输出“B version”func(p, D2()); //参数匹配&#xff0c;输出“D2 version”return 0;
}template
void advance_II(InputIterator& i, Distance n)
{//单向&#xff0c;逐一前进while (n--)&#43;&#43;i;
}template
void advance_BI(BidirectionalIterator& i, Distance n)
{//双向&#xff0c;逐一前进if (n >&#61; 0)while (n--)&#43;&#43;i;elsewhile (n&#43;&#43;)--i;
}template
void advance_RAI(RandomAccessIterator& i, Distance n)
{//双向&#xff0c;跳跃前进i &#43;&#61; n;
}template
void __advance(InputIterator& i, Distance n,input_iterator_tag)
{//单向&#xff0c;逐一前进while (n--)&#43;&#43;i;
}//这是一个单纯的传递调用函数&#xff0c;在上面迭代器继承中介绍如何去除它
template
void __advance(RandomAccessIterator& i, Distance n,forword_iterator_tag)
{advance(i,n,input_iterator_tag());
}template
void __advance(BidirectionalIterator& i, Distance n,bidirectional_itertator_tag)
{//双向&#xff0c;逐一前进if (n >&#61; 0)while (n--)&#43;&#43;i;elsewhile (n&#43;&#43;)--i;
}template
void __advance(RandomAccessIterator& i, Distance n,random_access_iterator_tag)
{//双向&#xff0c;跳跃前进i &#43;&#61; n;
}//备注&#xff1a;此函数的命名以InputIterator为名&#xff0c;因为InputIterator为最低阶迭代器类型
template
void __advance(InputIterator& i, Distance n, input_iterator_tag)
{__advance(i, n, iterator_traits
}template
struct iterator_traits {typedef typename I::iterator_category interator_category;
};//针对原生指针设计的偏特化版本
template
struct iterator_traits
};//针对于pointer-to-const设计的偏特化版本
template
struct iterator_traits
};template
inline iterator_traits
__distance(InputIterator first, InputIteratorlast last,input_iterator_tag)
{iterator_traits
}template
inline iterator_traits
__distance(RandomAccessIterator first, RandomAccessIterator last,random_access_iterator_tag)
{//直接计算差距return last - first;
}template
inline iterator_traits
distance(InputIterator first, InputIteratorlast last,input_iterator_tag)
{//萃取出迭代器的类型typedef typename iterator_traits
}
十四、traits技术得保证 template
struct iterator {typedef Category iterator_category;typedef T value_type;typedef Distance difference_type;typedef Pointer pointer;typedef Reference reference;
};template
struct ListIter :public std::iterator
{};
十五、iterator源代码实例 //用于标记迭代器的类型
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag :public input_iterator_tag {};
struct bidirectional_iterator_tag :public forward_iterator_tag {};
struct random_access_iterator_tag :public bidirectional_iterator_tag {};template
struct iterator {typedef Category iterator_category;typedef T value_type;typedef Distance difference_type;typedef Pointer pointer;typedef Reference reference;
};//萃取机traits
template
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
struct iterator_traits
};//针对于pointer-to-const的偏特化版本
template
struct iterator_traits
};//参数为迭代器
template
inline typename iterator_traits
{typedef typename iterator_traits
}//参数为迭代器
template
inline typename iterator_traits
{return static_cast
}//参数为迭代器
template
inline typename iterator_traits
{return static_cast
}template
inline iterator_traits
__distance(InputIterator first, InputIteratorlast last,input_iterator_tag)
{iterator_traits
}template
inline iterator_traits
__distance(RandomAccessIterator first, RandomAccessIterator last,random_access_iterator_tag)
{return last - first;
}template
inline iterator_traits
distance(InputIterator first, InputIteratorlast last,input_iterator_tag)
{typedef typename iterator_traits
}template
void __advance(InputIterator& i, Distance n,input_iterator_tag)
{//单向&#xff0c;逐一前进while (n--)&#43;&#43;i;
}template
void __advance(BidirectionalIterator& i, Distance n,bidirectional_itertator_tag)
{//双向&#xff0c;逐一前进if (n >&#61; 0)while (n--)&#43;&#43;i;elsewhile (n&#43;&#43;)--i;
}template
void __advance(RandomAccessIterator& i, Distance n,random_access_iterator_tag)
{//双向&#xff0c;跳跃前进i &#43;&#61; n;
}template
void __advance(InputIterator& i, Distance n, input_iterator_tag)
{__advance(i, n, iterator_category(i));
}
十六、__type_traits概述
十七、__type_traits的使用目的是什么
十八、__typr_traits的使用方法 //下面的式子应该返回真或假&#xff0c;然后好让我们进一步判断
__type_traits
__type_traits
__type_traits
__type_traits
__type_traits//没有任何数据成员&#xff0c;单纯的用来表示“真”或“假”
struct __true_type {}; //真
struct __false_type {}; //假template
struct __type_traits {typedef __true_type this_dummy_must_be_first;/*不要移除这个成员&#xff0c;它通知“有能力自动将__type_traits特化”的编译器说&#xff0c;我们现在所看到的这个__type_traits_template是特殊的。这是确保万一编译器也使用一个名为__type_traits而其实与此处定义并无任何关联的template时&#xff0c;所有事情可以顺序编译通过*//*下面的成员可以自己添加/删除&#xff0c;用来表示某种数据类型是否具有某种特性*/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;
};/*下面是C&#43;&#43;针对基本数据类型char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long、float、double、long提供的特化版本注意&#xff1a;每一个成员都是__true_type的&#xff0c;因此这些数据类型可以用最快速的方法&#xff08;memcpy&#xff09;来进行拷贝或赋值操作__STL_TEMPLATE_NULL是定义在
*/template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};template
__STL_TEMPLATE_NULL struct __type_traits
};//针对原生指针设计的特化版本
template
__STL_TEMPLATE_NULL struct __type_traits
};
十九、__type_traits实际运用① template
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x)
{return __uninitialized_fill_n(first, n, x, value_type(first));
}//value_type()函数用来萃取first的数据类型&#xff0c;见前一篇文章template
inline ForwardIterator __uninitialized_fill_n(ForwardIterator first,Size n, const T& x,T1*)
{//萃取数据类型T1是否具有POD特性typedef typename __type_traits
}//不具有POD性质的函数
template
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first,Size n, const T& x, __false_type)
{ForwardIterator cur &#61; first;//为了阅读方便&#xff0c;此处省略了异常处理for (; n > 0; --n, &#43;&#43;cur)construct(&*cur, x);return cur;
}//具有POD性质的函数
//如果拷贝构造函数等同于拷贝赋值运算符&#xff0c;而且有trivial析构函数&#xff0c;那么下面就有效
template
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first,Size n, const T& x, __true_type)
{return fill_n(first, n, x);
}
//定义于
template
OutputIterator fill_n(OutputIterator first,Size n, const T& val)
{for (; n > 0; --n, &#43;&#43;first)*first &#61; value;return first;
}
二十、__type_traits实际运用②
二十一、__type_traits实际运用③ template
inline void copy(T* source, T* destination, int n)
{copy(source, destination, n, typename __type_traits
}//拥有一个non-trivial拷贝构造函数&#xff0c;调用这一版本
template
void copy(T* source, T* destination, int n, __false_type)
{//...
}//拥有一个trivial拷贝构造函数&#xff0c;调用这一版本
//其中直接使用memcpy()完成工作
template
void copy(T* source, T* destination, int n, __true_type)
{//...
}
二十二、对自己的类施加__type_traits机制 template
__STL_TEMPLATE_NULL struct __type_traits
};