一,模板和泛型
(1). 泛型编程
一般的函数只能对固定某一系列(基类及其派生类)类型进行操作。如
int Add(
const
int &
t1,
const
int &
t2)
{
return
t1 +
t2 ;
}
该函数只能应用于 int 类型。显然不太利于重用(顺便提一句,面向对象的终极目标就是重用最大化)。如果写代码时可以使用某个占位符来替换实际的类型,编译时再确定,其重用性就大大提高。这种思想就叫做 泛型编程。C++中实现泛型的机制被称为模板。
(2). 模板函数
C++使用模板来实现泛型编程。
模板使用 关键字template 声明,放在要定义泛型的函数或类之前。
template <typename T>
T Add(
const
T &
t1 ,
const
T &
t2 )
{
return
t1 +
t2 ;
}
其中
使用 关键字
typename 来定义占位符名称并放在一对尖括号中。而泛型函数使用起来和普通函数一样。下边为一个完整示例
class
Base
{
public :
int num;
Base operator+ (
const
Base &
ba)
const
{
Base tem;
tem.num = num +
ba .num;
return tem;
}
};
template <typename T>
T Add(const T & t1 , const T & t2 )
{
return
t1 +
t2 ;
}
int
_tmain (
int
argc,
_TCHAR*
argv [])
{
Base b1,b2;
b1.num = 10;
b2.num = 20;
Base
b3 =
Add<Base>(b1,b2)
;
cout << b3.num << endl;
}
//return: 30
模板
函数在调用时也可以不声明或只声明一部分(未声明类型需放在最右边)模板参数类型,因为编译器会根据实参类型自动推导获得。
Base
b3 =
Add(b1,b2)
;
(3). 模板函数重载
模板函数也支持重载。无论是模板类型参数不同 或者 函数签名不同(一般重载)
的同名函数
,都视为重载。
template
<typename T>