本文主要是介绍【函数模板】特化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、函数模板的泛化
函数模板的泛化就是一般情况下写的函数模板,不存在指定类型。
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";
}
具体而言,就是重载不同的参数个数。
这篇关于【函数模板】特化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!