一、函数模板的泛化
函数模板的泛化就是一般情况下写的函数模板,不存在指定类型。
template<typename T,typename R>
void Func(T& x,R& y ) {
std::cout << "调用了Func的泛化版本\n";
std::cout << x << " " << y << "\n";
}
二、函数模板的全特化
函数模板的全特化就是指定函数的模板的全部类型。
全特化模板必须在模板前加入
t
e
m
p
l
a
t
e
<
>
template<>
template<>
并且,传入的参数限制必须保持一致,否则无法通过编译。如&,*等限制。
而全特化后的
<
i
n
t
,
d
o
u
b
l
e
>
<int,double>
<int,double>可以无需指定
//全特化
template<>
void Func<int,double>(int& x,double& y) {
std::cout << "调用了Func的全特化版本\n";
std::cout << x << "\n";
}
输出结果如下:
注意全特化和普通函数重载函数模板的区别。
注意下面的代码
//泛化
template<typename T,typename R>
void Func(T& x,R& y ) {
std::cout << "调用了Func的泛化版本\n";
std::cout << x << " " << y << "\n";
}
//全特化
template<>
void Func<int,double>(int& x,double& y) {
std::cout << "调用了Func的全特化版本\n";
std::cout << x << " " << y << "\n";
}
void Func(int& x, double& y) {
std::cout << "调用了Func的普通函数\n";
std::cout << x << " " << y << "\n";
}
void Test1() {
int x = 1, y = 2;
Func(x, y);
double z = 3.0;
Func(x, z);
}
我们在全特化的版本下又重载了一个普通函数的版本, 此时调用的就是
F
u
n
c
Func
Func的普通函数版本了
这就引发了调用优先级的问题
三、函数模板的偏特化
函数模板不存在偏特化。
以下代码将编译失败
template<typename T>
void Func<T, double>(T& x, double& y) {
std::cout << "调用了Func的偏特化版本\n";
std::cout << x << "\n";
}
如果需要,我们可以使用函数模板的重载来实现偏特化,如下:
//重载函数模板
template<typename T>
void Func(T& x, double& y) {
std::cout << "调用了Func的偏特化版本\n";
std::cout << x << "\n";
}
具体而言,就是重载不同的参数个数。