《函数模板学习笔记》

  1. 函数模板
    函数模板的目的:当函数的逻辑相同,但函数参数类型不同时,让类型参数化。
#include 
using namespace std;

template //通知编译器开始泛型编程
void TPrint(T1 x, T2 str1) //两个不同参数的情况
{
	cout << "TPrint x:" << x << endl;
	cout << "TPrint str1:" << str1 << endl;
}
template  
void TSwap(T &a, T &b) //两个相同参数的情况
{
	T c;
	c = a;
	a = b;
	b = c;
	cout << "模板函数TSwap" << endl;
}
int main()
{
	int x = 10;
	int y = 20;
	char str1 = 'a';
	char str2 = 'b';
	TSwap(x,y);//函数模板显示调用
	//TSwap(x, y);//函数模板隐式调用
	cout << "X:" <<  x <(str1, str2);//函数模板显示调用
	//TSwap(str1, str2);//函数模板隐式调用
	cout << "str1:" << str1 << endl;
	cout << "str2:" << str2 << endl;

	TPrint(x,str1);//函数模板显示调用
	//TPrint(x, str1);//函数模板隐式调用
	system("pause");
	return 0;
}
  1. 函数模板遇上函数重载
    调用函数模板(本质:类型参数化)会对入口参数严格的按照类型匹配,不会进行自动类型转换。
    普通函数的调用:可以进行隐式的类型转换。
    调用规则研究:
    (1) 函数模板可以像普通函数一样被重载。
    (2) C++编译器优先考虑普通函数。
    (3) 如果函数模板可以产生一个更好的匹配,那么选择模板。
    (4) 当函数模板和普通函数都符合调用时,优先选择普通函数
#include 
using namespace std;

int  Max(int a, int b)
{
	cout << "Max(int a, int b)" << endl;
	return a > b ? a : b;
}
template 
T Max(T a, T b)
{
	cout << "T Max(T a, T b))" << endl;
	return a > b ? a : b;
}
template 
T Max(T a, T b, T c)
{
	cout << "T Max(T a, T b, T c)" << endl;
	return Max(Max(a,b), c);
}
int main()
{
	int a = 1;
	int b = 2;
	cout << Max(a, b) << endl;//当函数模板和普通函数都符合调用时,优先选择普通函数
	cout << Max<>(a, b) << endl;//若显式使用函数模板,则使用<>类型列表
	cout << Max(3.0,4.0) << endl;//如果函数模板产生更好的匹配使用函数模板
	cout << Max(3.0, 4.0,5.0) << endl;//重载
	cout << Max('a', b) << endl;//调用普通函数,可以隐式转换
	system("pause");
	return 0;
}
  1. 函数模板原理
    C语言编译器gcc,C++语言编译器g++。
    编译器并不是把函数模板处理成能处理任意类的函数,编译器从函数模板通过具体类型产生不同的函数。编译器会对函数模板进行两次编译:
    (1) 在声明的地方对模板代码本身进行编译
    (2) 在调用的地方对参数替换后的代码进行编译

你可能感兴趣的:(C++)