少壮不努力,老大搞IT(工厂)
最近写我的框架用到了模板,对这个东西不懂,乱猜搞了些上去,勉强通过编译,其实我的下理解是定义类型罢了,下面就看书总结下
模板----》需求多态性
举个简单例子:
example:
template<typename T>
int compare(const T &v1,const T&v2)
{
if(v1 > v2 ) return 1;
if(v1 < v2) retrun -1;
return 0;
}
形参表:
template<{class|typename} arg[,{..}...]>
使用函数模板时,心悦编译器会推断哪个模板实参绑定到模板形参。一旦编译器确定了实际的模板实参,就称它实例化了函数模板的一个实例。
用在类上
template<class Type> class Queue
{
Type &front(); // 返回该种类型
const Type &front() const;
...
}
使用:
Queue<int> q;
Queue<vector<double>> q;
Queue<string> q;
_______________________________________
typename 与class
typename 是后来加入c++标准,旧的程序只能使用class
新程序用typename 更为直观
关于类型属性问题
example:
template<class Parm,class U>
Parm fcn(Parm* array, U value)
{
Parm::size_type * p ; // size_type是一个类型还是一个成员呢
}
编译器是默认为一个成员的,如果是表达为类型,则要显式告诉编译器,如下:
template<class Parm,class U>
Parm fcn(Parm* array, U value)
{
typename Parm::size_type * p ; // size_type是一个类型
}
其实上面的做法不好,感觉太高级,但太容易出错的
初始化一个数组
example :
template<class T,size_t N> void array_init(T (&parm)[N])
{
for(size_t i=0; i!=N; ++i){
parm[i] = 0;
}
}
use:
int x[12];
double y[100]
array_init(x);
array_init(y);
上面这个例子可以用来初始化一个数据的值为某一值。高级!