C++模板是让C++成为通用型程序设计语言的一个特性,C++的模板机制使人在定义类和函数时以类型作为参数,模板只以来实际使用的时由他的参数而来的性质,并不要求被用作参数的那些不同了类型之间又任何显示的联系。下面介绍一些模板的基本技术:
例子:
templateclass String { //template 声明一个模板, C是类型名,并不一定是一个类 struct Srep; Srep *rep; public: String(); String(const C*); String(const String&); C read(int i) const; };
例子:
Stringcs; //char类型的Sting String us; //unsigned char 类型的String String ws; //wchar_t 类型的String
从一个模板类和一个模板参数生成一个类声明的过程通常被成为模板实例化,同样适用于模板函数生成函数。
模板可以有类型参数,可以又常规类型的参数,还可以又模板参数,一个模板也可以又多个参数。
例子:
template
模板参数必须是常量,如常量表达式,具有外部链接的对象,函数地址,或者非重载的指向成员函数的指针。
定义一个函数模板,如下:
templatevoid sort(vector &); //声明 void f(vector & vi, vector & vs) //定义 { sort(vi); sort(vs); }
函数模板的参数,函数模板对写出通用型算法很重要,编译器能够从一个调用推断出类型参数和非类型参数,条件是这个调用的函数参数表能够唯一地标识出模板参数的一个集合。
可以声明多个具有同样名字的函数模板,还可以声明具有同一个名字的多个函数模板和常规函数的组合.
例子:
templateT sqrt(T); template complex sqrt(complex ); double sqrt(double); void f(complex z) { sqrt(2); //sqrt (int) sqrt(2.0) //sqrt(double) sqrt(z); //sqrt (complex ) }
找出最佳专门化的过程:
一个非模板类派生出一个模板类,例子:
templateclass Vector : private Vector { /* */ }
一个模板类派生出一个模板类,例子:
templateclass vector{ /* */ } template class Vec : public vector { /* */ }
成员模板, 一个类或者模板也可以包含本身就是模板的成员,例子:
templateclass complex { Scalar re, in; public: template complex(const complex & c) : re(c.real()), im(c.imag()) { } //... }; complex cf(0,0); complex cd = cf; //float到double的装换