C++模板元

1>. 模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,
从而实现了真正的代码重用。

2>. 模板关键字  
template 
typename/class 

3>.模板与宏很类似
a.宏是在预处理阶段处理,模板是在编译阶段处理。
b.宏不会进行类型检查,只会单冲的进行文本替换,模板会进行类型检查。
c.宏直接就可以产生代码,而编译器遇到模板定义时,并不产生代码,只要
当模板实例化后时才会产生代码。


4>.函数模板 : 将相同函数模板化
   模板函数 : 函数模板 生成的 函数


5>.如果在全局域中声明了与模板参数同名的对象函数或类型则该全局名将被隐藏。

typedef double T;

template<class T>
T sum(T a, T b)
{
	T tmp = a+b;//tmp类型为模板参数T,而不是double
	return tmp;
}

6>.在函数模板定义中声明的对象或类型不能与模板参数同名。

template<class T>
T sum(T a, T b)
{
	//错误:重新声明模板参数 Type
	//放到模板体里面则会错误,不允许T重名
	typedef double T;
	T tmp = a+b;
	return tmp;
}

7>.模板类型参数名可以被用来指定函数模板的返回类型。

template<class T1, class T2, class T3>
T3 sum(T1 a, T2 b)
{
	//三个的类型可不同
	T3 tmp = (a+b);
	return tmp;
}

8>.模板参数名在同一模板参数表中只能被使用一次,但是模板参数名可以在

多个函数模板声明或定义之间被重复使用

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.指向对象或函数的指针与引用(左值引用)可作形参。

	template<int r>
	void test()
	{
		int a[r];//编译时指定数组大小
		cout<<sizeof(a);
	}
	test<5>();
	cout<<endl;
	test<10>();





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值