C++提高编程-模板

模板的基本概念

模板的主要用于提高C++的泛型编程而设计的,可以把模板理解为通用的模具,大大提高复用性,这和字面意思也差不多。

函数模板

函数模板基本概念

image

template<typename T>  //typename可以替换成class
写函数,其中变量用T表示

实例代码如下:

//函数模板语法如下
//声明的意义在于告诉编译器,紧跟的函数中的T不要报错,为泛型
template<typename T>
void Swap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

void test01()
{
	int a = 10;
	int b = 20;
	//模板使用方法如下
	//1.自动类型推导
	Swap(a, b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	//2.显示告知
	Swap<int>(a, b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

使用函数模板时,必须确定出通用数据类型T,并且能够推导出一致的类型。

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

image
示例代码如下:

//普通函数
int add(int a, int b)
{
	return a + b;
}

//函数模板
template<typename T>
int myAdd(T a, T b)
{
	return a + b;
}

void test01()
{
	int a = 10;
	int b = 20;
	char c = 'a';
	//普通函数可以隐式类型转换
	cout << add(a, c) << endl;

	//模板函数自动类型推导,无法进行隐式类型转换
	//cout << myAdd(a, c) << endl;

	//模板函数显示指定类型,可以进行隐式类型转换
	cout << myAdd<int>(a, c) << endl;
}

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

image
实例代码如下:

//普通函数和函数模板调用规则
//1.如果函数模板和普通函数都可以调用,优先调用普通函数
//2.可以通过空模板参数列表 强制调用函数模板
//3.函数模板可以发生函数重载
//4.如果函数模板可以产生更好的匹配,优先调用函数模板

//普通函数
void myPrint(int a, int b)
{
	cout << "调用普通函数" << endl;
}

//函数模板
template<typename T>
void myPrint(T a, T b)
{
	cout << "调用函数模板" << endl;
}

//函数模板可以发生重载
template<typename T>
void myPrint(T a)
{
	cout << "调用重载的函数模板" << endl;
}

void test01()
{
	int a = 10;
	int b = 20;

	//都可以调用时,优先调用普通函数
	myPrint(a, b);

	//通过空模板参数列表,强制调用模板
	myPrint<>(a, b);
	myPrint<int>(a, b);

	//函数模板可以发生承载
	myPrint(a);

	//如果函数模板可以产生更好的匹配,优先调用函数模板
	char c1 = 'a';
	char c2 = 'b';
	myPrint(c1, c2);

}

模板局限性

示例代码如下:

//模板局限性
//模板并不是万能的,有些特定数据类型,需要用具体化方式做特殊实现

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Age = age;
		this->m_Name = name;
	}
	//1.第一种方法,可以采用重载运算符的方法实现.
	/*bool operator==(const Person& p)
	{
		if (this->m_Age == p.m_Age && this->m_Name == p.m_Name)
			return true;
		return false;
	}*/

	string m_Name;
	int m_Age;
};

//对比两个数据是否相等
template<typename T>
bool myCompare(T& a, T& b)
{
	if (a == b)
	{
		return true;
	}
	return false;
}

//2,第二种解决办法,对模板具体化,优先调用
template<> bool myCompare(Person& a, Person& b)
{
	if (a.m_Age == b.m_Age && a.m_Name == b.m_Name)
		return true;
	return false;
}


void test01()
{

	Person p1("Tom", 12);
	Person p2("Tom", 12);

	bool ret = myCompare(p1, p2);

	if (ret)
	{
		cout << "p1 == p2" << endl;
	}
	else
	{
		cout << "p1 != p2" << endl;
	}

}

类模板

类模板语法

image
示例代码如下:

//类模板
template<class NameType, class AgeType>
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->m_Age = age;
		this->m_Name = name;
	}
	
	void show_Person()
	{
		cout << this->m_Name << ' ' << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};

void test01()
{
	Person<string,int> p1("孙悟空", 999);
	
	p1.show_Person();
}

类模板和函数模板的区别

示例代码如下:

//类模板和函数模板的区别
//1.类模板没有自动类型推导
//2.类模板参数列表中可以有默认参数

//类模板
template<class NameType, class AgeType = int>
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->m_Age = age;
		this->m_Name = name;
	}
	
	void show_Person()
	{
		cout << this->m_Name << ' ' << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};

void test01()
{

	//Person p1("孙悟空", 999); //错误,类模板没有自动类型推导
	Person <string>p("猪八戒", 1888);
	p.show_Person();
	
}

类模板中成员函数创建时机

image
很好理解,创建时,并不知道类模板中参数类型,所以函数中并不知道参数,无法有效的调用。
当调用函数时,才知道参数列表,这时才会创建函数。

posted @ 2024-11-18 22:46  逆天峰  阅读(2)  评论(0编辑  收藏  举报
作者:逆天峰
出处:https://www.cnblogs.com/gcfer//