模板(一):模板与非类型模板参数&模板的模板参数
活着就意味必须要做点什么,请好好努力。 ------《地下》
函数模板&类模板模版是泛型编程的基础, 模版分为 函数模版 和 类模版
函数模板格式: template 返回类型 函数名(参数列表){...}模板形参的定义既可以使用class,也可以使用typename,含义是相同的.
//一个简单的函数模板,比较 left 和 right, 与类型无关templatebool IsEqual (const T& left , const T& right ){return left == right;}void test1 (){string s1 ("s1"), s2("s2" );IsEqual (s1, s2);IsEqual (1,1);}模板参数匹配及显示实例化
template bool IsEqual (const T& left , const T& right ){return left == right;}void test1 (){coutreturn left == right;}template bool IsEqual (const T1& left , const T2& right){return left == right;}void test1 (){coutpublic :SeqList();~ SeqList();private :int _size ;int _capacity ;T* _data ;};template SeqList :: SeqList(): _size(0), _capacity(10), _data(new T[ _capacity]){}template SeqList ::~ SeqList(){delete [] _data ;}void test1 (){SeqList sl1;SeqList sl2;}模板类的实例化 类模板是用来生成类的蓝图的。 与函数模板的不同之处是:编译器不能为类模板推断模板参数类型。为了使用类模板,我们必须在模板名后的尖括号中提供额外信息——用来代替模板参数的模板实参列表。
##非类型模板参数&模板的模板参数
####模板参数–实现容器适配器
template class SeqList{private :int _size ;int _capacity ;T* _data ;};// template template // 缺省参数class Stack{public :void Push (const T& x );void Pop ();const T & Top();bool Empty ();private :Container _con ;};void Test (){Stack s1;Stack s2 ;// 思考下面这种使用场景会怎样?Stack s3 ;}####模板的模板参数–容器适配器
template class SeqList{private :int _size ;int _capacity ;T* _data ;};// template template // 缺省参数class Stack{public :void Push (const T& x );void Pop ();const T & Top();bool Empty ();private :Container _con;};void Test (){Stack s1;Stack s2;}####非类型的类模板参数
// 静态顺序表//templatetemplate //带缺省模板参数class SeqList{public :SeqList();private :T _array [MAX_SIZE];int _size ;};template SeqList ::SeqList (): _size(0){}void Test (){SeqList s1;SeqList s2;}####非类型的模板函数参数
template T Add (const T& x ){return x + value;}浮点数和类对象是不允许作为非类型模板参数的
//template//errortemplate //errorclass Test{private :double _value ;};补充: C++ 中 typename 和 class 的区别
在 C++ Template 中很多地方都用到了 typename 与 class 这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习 C++ 的人对 class 这个关键字都非常明白,class 用于定义类,在模板引入 c++ 后,最初定义模板的方法为:
template......这里 class 关键字表明T是一个类型,后来为了避免 class 在这两个地方的使用可能给人带来混淆,所以引入了 typename 这个关键字,它的作用同 class 一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:
template......在模板定义语法中关键字 class 与 typename 的作用完全一样。
typename 难道仅仅在模板定义中起作用吗?其实不是这样,typename 另外一个作用为:使用嵌套依赖类型(nested depended name),如下所示:
class MyArray { public: typedef int LengthType;.....}templatevoid MyMethod( T myarr ) { typedef typename T::LengthType LengthType; LengthType length = myarr.GetLength; }这个时候 typename 的作用就是告诉 c++ 编译器,typename 后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有 typename,编译器没有任何办法知道 T::LengthType 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
模板(二):模板的特化与模板的分离编译 模板(三):模板之类型萃取(TypeTraits)