学习模板trait

原创 2015年11月18日 11:44:32

STL源码剖析里面的关于traits技术的描述很详细,这里将部分记录下来

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<class Category,class T,class Distance=ptrdiff_t,
	class Pointer=T*,class Reference=T&>
	struct iterator{
		typedef Category iterator_category;
		typedef T 		 value_type;
		typedef Distance difference_type;
		typedef Pointer pointer;
		typedef Reference reference;
	};

	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 iterator_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 iterator_traits<const T*>{
		typedef random_access_iterator_tag 	iterator_category;
		typedef T 							value_type;
		typedef ptrdiff_t 					difference_type;
		typedef const T*					pointer;
		typedef const T&					reference;
	};


	template <class Iterator>
	inine typename iterator_traits<Iterator>::iterator_category
	iteratorCategory(const Iterator&)
	{
		typedef typename iterator_traits<Iterator>::iterator_category category;
		return category();
	}

	template<class InputIterator,class Distance>
	inline void __advance(InputIterator& i,Distance n,input_iterator_tag){
		while(n--)++i;
	}

	template<class BidirectionalIterator,class Distance>
	inline void __advance(BidirectionalIterator& i,Distance n,bidirectional_iterator_tag){
		if(n>=0)
			while(n--)++i;
		else
			while(n++)--i;
	}

	template <class RandomAccessIterator,class Distance>
	inline void __advance(RandomAccessIterator& i,Distance n,random_access_iterator_tag){
		i += n;
	}

	template<class InputIterator,class Distance>
	inline void advance(InputIterator& i,Distance n){
		__advance(i,n,iteratorCategory(i));
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

trait与policy模板技术

转载.源博客地址:http://blog.csdn.net/zhoudaxia/article/details/4486487 trait与policy模板技术

Step By Step(C++模板Trait)

Trait是C++模板设计的一个基本应用技巧,通过应用Trait模板参数,可以在工业强度的程度设计中既保证了程序的灵活性,同时也有效的减少了类型参数的数量。对于普通函数而言,如果想要对该函数的功能进行...

php trait 学习笔记

PHP中的类不支持多继承,但是提供了trait语法类解决单继承没法提供的多层代码复用问题。

STL学习之迭代器和trait编程技巧

一、迭代器的概念 迭代器是STL将数据容器和算法分开后连接的纽带,也是泛型思维发展的必然结果。泛型算法就是通过迭代器操作容器的,使得算法和容器本身分离开来。 迭代器模式:提供一种方式,可以...

Scala学习笔记13【trait之多重继承、AOP实战】

Scala多重继承Scala多重继承实战代码示例:class Human{ println("Human") }//定义teacher特性 trait TTeacher extends Human...

Scala学习笔记5--Trait

Scala-Trait Trait Trait就像一个拥有部分实现的接口,可以通过with关键字混入导类中。 trait Friend { val name: String d...

Scala学习笔记12【继承、抽象类、trait实战】

Scala 继承代码示例:class Father(val name: String, val age: Int){ println("Father is here.") val school ...

scala学习笔记3(trait)

class UseTrait { } trait Logger{ def log(msg : String){ println("log: " + msg) } } class ...

泛型编程技巧(trait_Policy)

  • 2013-10-01 20:27
  • 1.41MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)