关于C++模板元的实例讲解
1>. 模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,
从而实现了真正的代码重用。
2>. 模板关键字
template
typename/class
3>.模板与宏很类似
a.宏是在预处理阶段处理,模板是在编译阶段处理。
b.宏不会进行类型检查,只会单冲的进行文本替换,模板会进行类型检查。
c.宏直接就可以产生代码,而编译器遇到模板定义时,并不产生代码,只要
当模板实例化后时才会产生代码。
4>.函数模板 : 将相同函数模板化
模板函数 : 函数模板 生成的 函数
5>.如果在全局域中声明了与模板参数同名的对象函数或类型则该全局名将被隐藏。
[cpp] view plain copy
typedef double T;
template<class T>
T sum(T a, T b)
{
T tmp = a+b;//tmp类型为模板参数T,而不是double
return tmp;
}
6>.在函数模板定义中声明的对象或类型不能与模板参数同名。
[cpp] view plain copy
template<class T>
T sum(T a, T b)
{
//错误:重新声明模板参数 Type
//放到模板体里面则会错误,不允许T重名
typedef double T;
T tmp = a+b;
return tmp;
}
7>.模板类型参数名可以被用来指定函数模板的返回类型。
[cpp] view plain copy
template<class T1, class T2, class T3>
T3 sum(T1 a, T2 b)
{
//三个的类型可不同
T3 tmp = (a+b);
return tmp;
}
8>.模板参数名在同一模板参数表中只能被使用一次,但是模板参数名可以在
多个函数模板声明或定义之间被重复使用
[cpp] view plain copy
template<class T, class T>//错误:模板参数名 T的非法重复定义
T sum(T a, T b)// 这地方T可重复使用
{
//三个的类型可不同
T tmp = (a+b);
return tmp;
}
9>.模板形参之非类型参数
非类型形参的局限:
a.浮点数不可以作为非类型形参,包括float double 。具体原因可能是历史因素,也许未来
C++会支持浮点数。
b.类不可以作为非类型形参。
c.字符串不可以作为非类型形参。
d.整形,可转化为整形的类型都可以作为形参,比如int, char, long, unsigned,
bool, short,(enum声明的内部数据可以作为实参传递给int,但是一般不能当形参)
e.指向对象或函数的指针与引用(左值引用)可作形参。
[cpp] view plain copy
template<int r>
void test()
{
int a[r];//编译时指定数组大小
cout<<sizeof(a);
}
test<5>();
cout<<endl;
test<10>();
上一篇: 你放心不是拉你