C++函数模板

大纲

          • 函数模板的基本语法
          • 可能遇到的问题
          • 普通函数与函数模板区别于注意事项
          • 普通函数与函数模板调用规则
          • 模板的局限性

函数模板的基本语法

泛型的声明方式

templateT>

templateT>


模板类型标识通用性,但是也不能说所以类型都可以用
比如拿一个自定义的类去做加减法
在调用这个模板函数时,有两种调用方式↓
一种直接传参调用test01(2,3);
另一种就是在函数名后面函数名<类型a>(类型a,类型a);
比如test01(2,3);这样是告诉编译器我传参是int型
但它也可以解决普通函数与函数模板的调用时机


函数代码

template
T test01(T test , T test_tow)
{
	return test+test_tow;
}
int main(void)
{
    //test01(2,3);
    test01(2,3);
}

可能遇到的问题

我发现使用char类型做加减时,数据类型被编译器隐式转换为了ASCII对应的int型
然后拿着这个int型做加减↓

char toInt = 'a';
char toTnt_tow = 'b';
test01(toInt,toTnt_tow);

打印结果为
195
大家都知道a对应的int为97,b对应的int为98
编译器用int形式加减返回
这种问题怎么解决?
我们可以声明告诉编译器,不要偷偷转int,就用char
怎么做呢?
很简单,test01(2,3);
打印结果为
ab


普通函数与函数模板区别于注意事项

如果传入的第一个参数是int型,那么第二个参数也必须是int型
类型必须要统一
如果申明了templateT>那么下面的函数必须要用这个T模板
或者你也可以这样test01(2,3);
随便推导一个数据类型
模板必须确定出一个数据类型才可以使用


普通函数与函数模板调用规则

假定一个普通函数与函数模板参数类型(泛型/int)并且它的函数名返回值都相同
编译器会不会因为重载问题而报错?
不会报错
那么它会调用哪一个?
优先调用普通函数
怎么才能调用到这个函数模板?
用推导的方式写
函数名<>(传参);
一般的,在实际编程中,不会出现这种问题(也不建议这样写)

#include
#include
using namespace std;

int myAdd01(int a , int b)
{
	cout << "普通函数" << endl;
	return a + b;
}
template
T myAdd01(T a, T b)
{
	cout << "函数模板" << endl;
	return a + b;
}
int main(void)
{
	cout << myAdd01<>(97, 1) << endl;
}

如果用上面的代码块的函数串两个char类型它会优先用哪个?
它会优先用函数模板,为什么呢?
因为我们传入的数据类型为char类型
调用int参数的函数需要自动类型转换
编译器为了简化步骤,直接调用函数模板


模板的局限性

不是所有类型都可以使用
如果来一个自定义的Person会发生什么?
下面代码是错误示范↓

class Person
{
public:
	Person(int setAge) :Age(setAge) {}
	int Age;
};
template<typename T>
bool myAdd01(T a, T b)
{
	if (a == b)//到底是比较Person的什么???
	{
		return true;
	}
	return false;
}
int main(void)
{
	Person p1(1);
	Person p2(2);
	if (myAdd01(p1,p2)) 
	{
		cout << "类型相等" << endl;
	}
	else
	{
		cout << "类型不相等" << endl;
	}
}

可以看到maAdd函数中的判断不知道要判断Person什么
这里不建议使用运算符重载
可以添加这样写↓

template<> bool myAdd01(Person &a, Person &b)
{
	if (a.Age == b.Age)
	{
		return true;
	}
	return false;
}

这样就具体化

end.

你可能感兴趣的:(c++,笔记,C)