C++模板之函数模板

模板分为函数模板与类模板
语法:template < typename T>
template 声明这是在创建模板
typename 表示后面的符号是一种数据类型,习惯上,如果声明类模板,则template < class T>,除了名字,没有什么不同

对于函数,例如 void funct(int a)中 void函数返回值类型与int参数类型可以先不指定
一、使用方法:
举例:

int addIn(int &m,int &n) //两整型数相加
{
	int val = m+n;
	return val ;
}
double addFloat(double &m,double &n)//两浮点型数相加
{
	double val = m+n;
	return val ;
}

可以发现,上面两个函数实现的功能都是一样,只有参数类型以及返回值类型不一样;所以可以换成函数模板实现:
template <typename T>
T myadd(T &m,T &n)
{
	T val = m+n;
	return val;
}
使用方式如下:
①不指定模板参数类型
	int m = 12,;
	int n = 13;
	int recVal = 0;
	recVal = myadd(m, n);
经测试 可以正常运行。但是,注意:这种方式必须有一致的数据类型T,如果上述的m和n的数据类型不一样,则报错,即不能进行类型转换。例如:
	int m = 12;
	double  n = 13.0;
	int recVal = 0;
	recVal = myadd(m, n);
②指定模板参数类型
	recVal = myadd<int>(m, n);
	cout << recVal << endl;

二、普通函数与函数模板的区别:
普通函数可以自动进行类型转换,而函数模板只有在指定类型时才可以进行类型转换,在不指定模板类型时不能发生类型转换,如上面①所示的情况。
举例:

Ⅰ、普通函数:
int add(int a,int b)
{
	return a+b;
}
传参时:    
	int m = 10;
    char n = 'a';  //注意n是字符型
    cout << add(m, n) << endl;
不会报错,会将char转换为ASCII码整型数据,最终输出的结果是107.

Ⅱ、函数模板在指定类型时:
template <typename T>
T add(T a, T b)
{
    return a + b;
}
传参时:    
	int m = 10;
    char n = 'a';  //注意n是字符型
    cout << add<int>(m, n) << endl;
也不会报错,会将char转换为ASCII码整型数据,最终输出的结果是107.

三、普通函数与函数模板的调用规则
当普通函数与函数模板都存在的情况下,优先调用普通函数,如果一定要调用函数模板,可以使用空模板参数列表来强制调用函数模板
1、优先调用普通函数

//普通函数
void myTest(int m,int n)
{
	cout << "调用普通函数"<< endl;
}

//函数模板
template <typename T>
void myTest(T m,T n)
{
	cout << "调用模板函数"<< endl;
}
调用时:
myTest(10,20);
经过测试,可以发现调用的是普通函数。

2、在上面“1、优先调用普通函数”的情况下如何强制调用函数模板

使用空模板参数列表:
//普通函数
void myTest(int m,int n)
{
	cout << "调用普通函数"<< endl;
}

//函数模板
template <typename T>
void myTest(T m,T n)
{
	cout << "调用模板函数"<< endl;
}
调用时:
myTest<>(10,20);                                    //     <>空参数列表
经过测试,可以发现调用的是函数模板。

3、函数模板可以重载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值