C/C++编程:函数模板

1060 篇文章 295 订阅

一、什么是函数模板

函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。

#include <iostream>
#include <cstdlib>

using namespace std;


template <class T>
T add(T a, T b)
{
	return a + b;
}
//函数模板的意义,在于通用,泛型
//VS2017之前:原生函数不调用也好会编译检查语法,但是模板函数只有调用的时候才编译,不调用则不编译,也就是不检查语法。

void main()
{
	//先调用原生函数,再调用母版函数
	cout << add(1, 2) << endl;     //3,原生函数优先于模板函数
	cout << add<int>(1, 2) << endl;   //3,明确类型,声明使用模板函数:用<>指明类型
	cout << add('1', '2') << endl;  //C
	cout << add('1', '2') << endl;
	system("pause");
}

二、原生函数优先于函数模板

#include <iostream>
#include <cstdlib>

using namespace std;

int add(int a, int b)
{
	return a - b;
}

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

void main()
{
	//先调用原生函数,再调用母版函数
	cout << add(1, 2) << endl;     //-1,原生函数优先于模板函数
	cout << add<int>(1, 2) << endl;   //3,明确类型,声明使用模板函数
	cout << add('1', '2') << endl;  //C, 推测:C++编译器只能,会根据参数类型调用不同的函数
	system("pause");
}

总结:
1、在2017之前函数模板不调用就不检查语法,但是在VS2017中,函数模板不调用也会检测函数模板
2、在VS2017中,函数模板除了会根据参数不同生成不同的函数实体外,其他的和函数模板没有什么不同
3、函数模板的意义在于通用泛型
4、函数模板可以用<>指定类型
5、原生函数优先于模板函数,如果需要强行调用模板,add<int>(1, 2) << endl;  

 

三、使用函数模板实现接口

#include <iostream>
#include <cstdlib>

using namespace std;
//泛型接口,处理任何数据类型,传递函数指针

void show(int num)
{
	cout << num << endl;
}

void show1(char num)
{
	cout << num + 1 << endl;
}
template < class T, class F>   //T表示数据类型,F表示函数
void run(T t, F f)
{
	f(t);
}


void main()
{
	run('1', show);   //49
	run('1', show1);  //50
	run(10, show1);    //11
	run(10.1, show1);  //11,浮点型隐式转换成int类型
	system("pause");
}

总结:所谓的函数接口,就相当一个共有类,用户只需要调用函数API接口,传入不同的参数,接口就会自动选择不同的函数执行

#include <iostream>
using namespace std;

template<class T>
void showit(T num)
{
	cout << num << endl;
}

template < class T, class F>
void run(T t, F f)
{
	f(t);
}
void main()
{
	
	run("abc", showit<const char[4]>);  //接口,严格类型
	cin.get();

}

总结:函数模板把共同点抽象出来作为模板,常用来实现接口

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值