C++ 之函数模板

2022/8/28 14:23:17

本文主要是介绍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;
}


这篇关于C++ 之函数模板的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程