ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 之函数模板

2022-08-28 10:01:44  阅读:138  来源: 互联网

标签:arr 函数 int void C++ 排序 模板


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;
}

标签:arr,函数,int,void,C++,排序,模板
来源: https://www.cnblogs.com/lofly/p/16631970.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有