首页 > 其他分享 >56.函数模板

56.函数模板

时间:2023-02-10 19:35:37浏览次数:43  
标签:函数 int 模版 void 56 编译器 模板 cout

1.什么是函数模版

  函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板

2.怎么编写函数模版

//T代表泛型的数据类型,不是只能写T,
template<class T>//让编译器看到这句话后面紧跟着的函数里有T不要报错
void mySwap(T &a,T &b)
{
	T tmp = a;
	a = b;
	b = tmp;
}


//可以这样定义函数模版
template<typename T>
void func2(T a,T b)
{

}

3.怎么使用函数模版

//T代表泛型的数据类型,不是只能写T,
template<class T>//让编译器看到这句话后面紧跟着的函数里有T不要报错
void mySwap(T &a,T &b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

template<class T>
void mySwap2()
{

}

//使用函数模版
void test02()
{
	int a = 10;
	int b = 20;

	//1.编译器会根据实参来自动推导数据类型
	mySwap(a,b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	char c = 'c';
	//mySwap(a, c);err,数据类型要一致

	//2.显示的指定类型
	mySwap<int>(a, b);//<>用参数列表告诉编译器我只传int类
	//mySwap<double>(a, b);//注意:指定类型,传入时不能不一致

	mySwap<>(a,b);
	//mySwap2<>();//err 调用时,必须让编译器知道泛型T具体是什么类型
}

4.编译器会对函数模版和类模版进行二次编译

//T代表泛型的数据类型,不是只能写T,
template<class T>//让编译器看到这句话后面紧跟着的函数里有T不要报错
void mySwap(T &a,T &b)//第一次编译
{
	T tmp = a;
	a= b;
	b = tmp;
}

//使用函数模版
void test02()
{
	int a = 10;
	int b = 20;

	//1.编译器会根据实参来自动推导数据类型
	mySwap(a,b);//编译器在函数模版被调用时,进行第二次编译
	/*
	void mySwap(int &a,int &b)
	{
		int tmp = a;
		a= b;
		b = tmp;
	}
	*/
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
}

5.隐式转换

template<class T>
T func(T a, T b)
{
	return a + b;
}
void test03()
{
	int a = 10;
	double b = 20.2;
	//如果使用参数列表指定数据类型,那么实参中可以隐式转换
	//如果转换成功,就调用,转换不成功就报错
	cout << func<int>(10,20.2) << endl;
}

6.函数模板和普通函数的区别

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//普通函数
int myPlus(int a, int b)
{
	return a + b;
}

template<class T>
int myPlus2(T a, T b)
{
	return a + b;
}

void test()
{
	int a = 10;
	int b = 20;
	char c = 'a';
	//普通函数可以进行隐式转换
	myPlus(a, c);
	//函数模版不能直接的进行隐式转换
	//myPlus2(a, c);
	myPlus2<int>(a, c);//如果要进行隐性转换,必须加上参数列表
}
int main()
{
	test();

	system("pause");
	return EXIT_SUCCESS;
}

7.普通函数和函数模版的调用规则

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//普通函数
void myPlus(int a, int b)
{
	cout << "普通函数" << endl;
}

template<class T>
void myPlus(T a, T b)
{
	cout << "函数模版" << endl;
}

template<class T>
void myPlus(T a, T b, T c)
{
	cout << "函数模版 T c" << endl;
}
//1.函数模版和普通函数可以重载
void test()
{
	int a = 10;
	int b = 20;
	//2.如果普通函数和函数模版都可以实现的功能,普通函数优先调用
	myPlus(a, b);

	//3.可以使用<>空参数列表强制调用函数模版
	myPlus<>(a, b);

	//4.函数模版之间也可以进行重载

	//5.如果函数模版可以产生更好的匹配,那么优先使用函数模版
	char c1 = 'a';
	char c2 = 'b';
	myPlus(c1, c2);
}

int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}

8.函数模版的局限性和解决方法

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
template<class T>
void func(T a, T b)
{
	if (a > b)
	{
		cout << "a>b" << endl;
	}
	else
	{
		cout << "a<=b" << endl;
	}
}
void test()
{
	int arr[20];
	int arr2[10];

	func(arr, arr2);
}

class Maker
{
public:
	Maker(string name,int age)
	{
		this->age = age;
		this->name = name;
	}
public:
	string name;
	int age;
};

template<class T>
void myfunc(T &a, T &b)
{
	if (a > b)
	{
		cout << "a>b" << endl;
	}
	else
	{
		cout << "a<=b" << endl;
	}
}
//不建议具体化函数模版,因为没有通用性
//具体化函数模版,注意上面的函数模版要有,才能具体化
template<>void myfunc<Maker>(Maker &a, Maker &b)
{
	cout << "函数模版的具体化" << endl;
	if (a.age > b.age)
	{
		cout << "a>b" << endl;
	}
	else
	{
		cout << "a<=b" << endl;
	}
}

void test02()
{
	Maker m1("aaa", 10);
	Maker m2("bbb", 20);

	myfunc(m1, m2);
}

int main()
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

参考资料

参考资料来源于黑马程序员

标签:函数,int,模版,void,56,编译器,模板,cout
From: https://www.cnblogs.com/codemagiciant/p/17110112.html

相关文章

  • 函数基础学习整理-python
    1.数学函数importmathprint('-1的绝对值是{}'.format(abs(-1)))print('divmod函数返回商和余数的元祖{}'.format(divmod(9,3)))#****print('sum函数求和{}'.fo......
  • Oracle 使用分析函数排名 rank()、dense_rank()、row_number() 使用详解
    Oracle使用分析函数排名rank()、dense_rank()、row_number()使用详解https://blog.csdn.net/li_tiantian/article/details/81584140?spm=1001.2101.3001.6650.3&utm_me......
  • 166_技巧_Power BI 窗口函数处理连续发生业务问题
    166_技巧_PowerBI窗口函数处理连续发生业务问题一、背景在生产经营的数据监控中,会有一类指标需要监控是否连续发生,从而根据其在设定区间中的连续频次来评价业务。例如......
  • 一文详解数仓GaussDB(DWS) 函数出参带出方式
    摘要:本文主要讲解DWS函数出参带出方式。本文分享自华为云社区《​​GaussDB(DWS)功能--函数出参#【玩转PB级数仓GaussDB(DWS)】​​》,作者:譡里个檔。DWS的PL/pgSQL函数/......
  • 一文详解数仓GaussDB(DWS) 函数出参带出方式
    摘要:本文主要讲解DWS函数出参带出方式。本文分享自华为云社区《GaussDB(DWS)功能--函数出参#【玩转PB级数仓GaussDB(DWS)】》,作者:譡里个檔。DWS的PL/pgSQL函数/存储......
  • vue中的渲染函数
    介绍Vue推荐在绝大多数情况下使用模板来创建你的HTML。然而在一些场景中,你真的需要JavaScript的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器。案例......
  • 好客租房137-获取当前定位数据的函数
    1将当前定位城市添加到cityList中2将当前定位城市的索引添加到cityIndex中asyncgetCityList(){constres=awaitaxios.get('http://localhost:8080/area/c......
  • 好客租房156-封装顶部导航栏组件(3功能处理withRouter)
    importReactfrom'react'import{NavBar}from'antd-mobile'//导入withRouter高阶组件import{withRouter}from'react-router-dom'import"./index.scss"funct......
  • 引用与函数
    引用用于函数的参数把函数的形参声明为引用,调用函数的时候,形参将成为实参的别名。这种方法也叫按引用传递或传引用。(传值、传地址、传引用只是说法不同,其实都是传值。)引......
  • JavaScript中的函数
    函数:一个被设计为执行特定任务的代码块语法通过function关键词定义,后面跟着其函数名称,然后是一对圆括号,圆括号中可以定义一些函数的参数。没有名称的函数呢?函数名称......