首页 > 编程语言 >C++ 之函数模板

C++ 之函数模板

时间:2022-08-28 09:55:46浏览次数:45  
标签: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++,排序,模板
From: https://www.cnblogs.com/lofly/p/16631970.html

相关文章

  • 《机器人SLAM导航核心技术与实战》第1季:第2章_C++编程范式
    《机器人SLAM导航核心技术与实战》第1季:第2章_C++编程范式视频讲解【第1季】2.第2章_C++编程范式-视频讲解【第1季】2.1.第2章_C++编程范式-C++工程的组织结构-视频......
  • 【C++】实现D3D9 的 Inline hook
    【C++】实现D3D9的Inlinehook 简单介绍一下HOOK原理:函数调用的过程大致是先push参数进去,再执行call函数地址,进入函数。此时将所调用的函数的前五个字......
  • 刨析一下C++构造析构函数能不能声明为虚函数的背后机理?
    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16631774.html先说结论:构造函数不能声明为虚函数,析构函数可以......
  • 对于函数极限存在的充要条件“lim f(x)=A互推f(x)=A+a(x) lim a(x)=0”补充解释
    对于函数极限存在的充要条件“limf(x)=A互推f(x)=A+a(x)lima(x)=0”补充解释毫无疑问,这个定义适用于任何函数极限,诺f(x)有去间断点的时候,a(x)也为可去间断点函数。例:......
  • es6——生成器函数
    文章结构生成器函数的定义与使用给生成器函数传参给生成器函数异步传参生成器函数的应用场景解决回调地域1//生成器函数的定义与使......
  • 简单动态变量文本模板
    TemplateUtils工具类importlombok.experimental.UtilityClass;importorg.springframework.cglib.beans.BeanMap;importjava.util.*;importjava.util.regex.Matche......
  • C++ Protobuf
    Protobufprotobuf(protocolbuffer)是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展......
  • Django入门到放弃之模板及标签
    1.django模板使用的两种方式#方式一 returnrender(request,'time.html',context={'current_date':str(now),'title':'lqzNB'})#方式二(页面静态化,提高网站并发量)......
  • qsort函数
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<string.h>intcmp(void*p1,void*p2){ return*(int*)p1-*(int*)p2;//转换......
  • 【C标准库】详解feof函数与EOF
    创作不易,多多支持!再说此函数之前,先来说一下EOF是什么EOF,为EndOfFile的缩写,通常在文本的最后存在此字符表示资料结束。在C语言中,或更精确地说成C标准函式库中表示文件......