一、函数模板
函数模板的一般说明形式如下:
template <模板参数表>
<返回值类型><函数名>(模板参数形参表)
{
// 函数定义体
}
在<模型参数表>中的每个类型参数都必须在模板函数形参表中得到使用。
#include <iostream>
using namespace std;
template<class T>
void PrintArray(T arr[], int len) {
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
template<class T>
T max(T a, T b)
{
return a > b ? a : b;
}
int main()
{
char c1 = 'a';
char c2 = 'b';
std::cout << "Hello World!\n";
// 自动推导参数类型
cout << max(1, 2) << endl;
// 也可以显式指定类型
cout << max<char>(c1, c2) << endl;
}
重载函数
承接上述代码。
template<class T>
T max(T a, T b, T c)
{
cout << "In overload version1" << endl;
// 具体代码
}
template<class T>
T* max(T *a, T *b)
{
cout << "In overload version2" << endl;
// 具体代码
}
二、函数模板特化
函数模板的特化必须把所有的模版参数全部指定。
- 模板特化时,必须要先有基础的模板函数
- 特化的函数名,参数列表要和基础模板函数相同
- template 后直接跟<> 里面不用写类型
template<>
char* max(char* a, char* b)
{
return strcmp(a, b) > 0 ? a : b;
}
三、函数模板和普通函数
1、区别
- 函数模板不允许自动类型转化
- 普通函数能够自动进行类型转化
2、调用规则
c++编译器优先考虑普通函数
#include <iostream>
using namespace std;
template<class T>
T max(T a, T b)
{
cout << "In generic version template " << endl;
return a > b ? a : b;
}
// 特化
template<>
const char* max(const char* a, const char* b)
{
cout << "In special version template " << endl;
return strcmp(a, b) > 0 ? a : b;
}
// 普通函数
const char* max(const char* a,const char* b)
{
cout << "In normal func " << endl;
return strcmp(a, b) > 0 ? a : b;
}
int main()
{
char c1 = 'a';
char c2 = 'b';
const char *c3 = "hello";
const char *c4 = "world";
std::cout << "Hello World!\n";
// 自动推导参数类型
cout << max(1, 2) << endl;
// 也可以显式指定类型
cout << max<char>(c1, c2) << endl;
// 优先调用普通函数
cout << max(c3, c4) << endl;
// 通过<>使用空参数列表强制调用函数模板
cout << max<>(c3, c4) << endl;
}
原文链接: https://www.cnblogs.com/tamya/p/15760543.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187237
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!