语法格式: t e m p l a t e < t y p n a m e T 1 , t y p n a m e T 2... > template<typname T1,typname T2...> template<typnameT1,typnameT2...>
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(double& a, double& b)
{
double tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1, b = 2;
double c = 1.1, d = 2.2;
cout << a << " " << b << endl;
swap(a, b);
cout << a << " " << b << endl;
cout << "----------------" << endl;
cout << c << " " << d << endl;
swap(c, d);
cout << c << " " << d << endl;
return 0;
}
在C语言中,如果我们需要分别交换 i n t int int 或 d o u b l e double double 的数据,那么我们需要定义两个swap函数并且还不能重名。(C语言并不支持函数重载)。
而在C嘎嘎中:
我们只需要写一个模版就可以了。这里的T在编译的时候会默认替换为我们的
i
n
t
int
int和
d
o
u
b
l
e
double
double
同时通过调试发现,这两个swap都进入我们写的函数模版,那么这两个Swap调用的是同一个函数吗?
通过反汇编发现,此时我们两个调用的并不是同一个函数。
当我们使用我们的
S
w
a
p
(
)
Swap()
Swap()模版的时候,编译器会去默认推演我们此时的参数类型,然后编译器自动生成一个
S
w
a
p
(
)
Swap()
Swap()函数,中国有句古话:死道友不死贫道[doeg]。咱们只管写一个模版,其他的交给编译器。
但是如果我们只有一个模版参数的话,传入两个不同类型编译器推导不出来。
此时我们有以下几种方法:
- 添加模版参数
- 进行强制类型转化
- 直接给定模版参数类型,不让编译器推演
A d d < i n t > Add<int> Add<int> 这个叫做显式实例化。它指定了参数的类型,编译器就不会推演了,T默认会 i n t int int 类型。