C++ 之函数模板
函数的参数类型不确定,这样就可以使用泛型。
// 类型参数化 C++中称之为泛型编程--模板技术
template <class T > // 告诉编译器,下面如果出现T不要报错,T是一个通用类型 这里将class替换成typename是一样的
void mySwap(T &a, T &b) {
T tmp = a;
a = b;
b = tmp;
}
自动类型推导,函数必须有参数才可以推导
// 2.显示调用
mySwap<int>(a, b); // 这里指定T是int类型
cout << "a=" << a << "," << "b=" << b << endl;
// 模板必须可以推导出T才可以使用 ,要么直接显示指定T
template < typename T>
void mySwap1() {
}
mySwap1 < double >(); // 如果不能根据参数列表推出来,就得显示指定类型
mySwap(a,b) // 根据a,b的类型自动推导T的类型。
mySwap<int> // (a,b)直接指定T的类型是int
2 使用函数模板实现通用数组排序
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
// 使用通用类型 对int char类型的数组进行排序
// 排序的规则 降序 使用选择排序
// 选择排序 每1趟中从待排序中选择一个最小的放在已排序的右端
template<class T>
void mySort(T arr[],int len) {
for (int i = 0; i < len-1;i++) {
int max = i;
for (int j = i + 1; j < len;j++) {
if (arr[max] < arr[j]) {
// 交换下标
max = j;
}
}
if (max != i) {
// 交换数据
swap(arr[max],arr[i]);
}
}
}
//输出数组元素的模板
template<class T>
void printArray(T arr[],int len) {
for (int i = 0; i < len;i++) {
cout << arr[i] << "/t";
}
}
void test01() {
char arr[] = "chengluofei";
//int len = sizeof(arr) / sizeof(char);
mySort(arr,strlen(arr));
printArray(arr, strlen(arr));
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
3 普通函数与函数模板的区别以及调用规则
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//1. 普通函数与函数模板的区别
template<class T>
T myPlus(T a,T b) {
return a + b;
}
int myPlus2(int a , int b) {
return a + b;
}
void test01() {
int a = 10;
int b = 20;
cout << myPlus(a, b) << endl;
cout << myPlus2(a, b) << endl;
int c = 'c';
//cout << myPlus(a, c) << endl; // 类型推导出错
// char类型自动转int 类型 1. 普通的函数可以隐式类型转换 函数模板不可以进行隐式类型转换
cout << myPlus2(a, c) << endl;
}
// 2. 普通函数和函数模板的调用规则
template<class T>
void myPrint(T a, T b)
{
cout << "模板调用的myPrint" << endl;
}
template<class T>
void myPrint(T a, T b,T c)
{
cout << "模板调用的myPrint(a,b,c)" << endl;
}
void myPrint(int a, int b)
{
cout << "函数调用的myPrint" << endl;
}
void test02() {
int a = 10;
int b = 20;
// 1.如果出现重载(普通函数和函数模板函数名与参数个数相同),优先调用普通的函数 如果没有实现普通函数 会出错
//myPrint(10,20);
// 2.如果想强制调用函数模板 可以使用空菱形列表
myPrint<>(10,20);
// 3.函数模板可以发生重载
myPrint<>(10, 20,30);
// 4. 如果函数模板可以优先产生更好的匹配,那么优先调用函数模板
char c = 'c', d = 'd';
myPrint(c,d);
}
int main()
{
test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/282675.html