学习模板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和Mataprogram

理解模板编程中的Trait和Mataprogram 不知道为什么,我最近越来越觉得C++太难了,也许是因为我也陷入到扣语言细节的泥沼了吧。不过换个角度来讲,C++之所以这么有吸引力,也多...

trait与policy模板技术

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

Step By Step(C++模板Trait)

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

Php学习之trait的使用

说通俗点,PHP中使用trait关键字是为了解决一个类既想集成基类的属性和方法,又想拥有别的基类的方法,而trait一般情况下是和use搭配使用的。本文和大家分享的就是php中trait使用相关内容,...

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

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

php trait 学习笔记

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

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

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

【PHP进阶学习】——Trait代码复用类

前言:众所周知,一直以来PHP和很多语言一样是单继承的语言,但是常常在编码过程中,我们需要在当前类中使用两个或两个以上的其他类的方法,这种情况下继承就不能实现,而往往采用new方式实例化很多要用到的类...

scala学习(十五)——trait

scala学习(十五)——trait 下面是一个trait的简单例子,里面包含的trait的基本用法,trait的继承: trait Logger{ //这里在java的接口中只能声明为静态的...

Scala学习笔记5--Trait

Scala-Trait Trait Trait就像一个拥有部分实现的接口,可以通过with关键字混入导类中。 trait Friend { val name: String d...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习模板trait
举报原因:
原因补充:

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