【第22期】观点:IT 行业加班,到底有没有价值?

学习模板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));
	}

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

相关文章推荐

C++模板Trait

http://blog.csdn.net/fjb2080/article/details/7969790 Trait是C++模板设计的一个基本应用技巧,通过应用Trait模板参数,可以在工业强度的程...

C++的学习感想(转载)

C++的学习感想  原作者姓名robindy正文很多人把学习C++语言当成学习VC了,我曾经就走过这样的弯路。当学了很长时间的VC后还是得回过头来学习C++语言本身。 那么学习C++从何处入手了?C++语言相对于C语言来说引入了两个大的新东西,一个就是面向对象(具体来将就是类),另外就是模板技术(模板编程或者叫泛型编程是进来非常流行的技术,在C#中虽然还没有对泛型编程的支持,但是相信在将来也一定会加入这一功能),模板是C++中比较复杂的部分,但是作为一个真正的C

Step By Step(C++模板Trait)

Step By Step(C++模板Trait) Posted on 2012-09-05 09:13 Stephen_Liu 阅读(2534) 评论(2) 编辑 收藏     Trait...

effective C++: 7模板与泛型编程

七 模板与泛型编程 条款41:了解隐式接口和编译期多态 面向对象编程世界总是以显示接口(explicit interface)和运行期多态(runtime polymorphism)解决问题。 class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); virtual swap(Widget&a

模板Trait 技术与简述template 元编程

模板Trait 技术想了好久都没有想到合适的例子,已是干脆直接使用[1]中的例子就好了。STL 中引入了迭代器的概念。但是在本文中的例子不直接使用STL 的迭代器,而是写了一段很简短的代码,作为演示使...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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