1009模板05模板的局限性

311 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

1.函数模板的局限性

局限性:

  • 模板的通用性并不是万能的

例如:

	template<class H>
	void f(H a, H b)
	{ 
    	a + b;
    }

在上述代码中提供的赋值操作,如果传入的a和b是一个数组,就无法实现了

再例如:

	template<class H>
	void f(H a, H b)
	{ 
    	if(a != b) { ... }
    }

在上述代码中,如果T的数据类型传入的是像类这样的自定义数据类型,也无法正常运行

因此C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板

2.普通模板实现判断两个整型变量是否相等

#include<iostream>
#include <fstream>
#include <string>
using namespace std;
void spr(int a, int b) {
	cout << "a+b = " << a + b << endl;
	cout << "调用的是普通函数 " << endl;
}

template<typename H>
bool spr(H a, H b) {
	if (a == b)
		return true;
	else
		return false;
}

int main() {
	char a = 'a';
	char b = 'b';

	if (spr(a, b)) {
		cout << "a == b!" << endl;
	}
	else {
		cout << "a != b" << endl;
	}
	system("pause");
	return 0;
}

输出:

a != b 请按任意键继续. . .

3.在上述代码中,如果H的数据类型传入的是像类这样的自定义数据类型,也无法正常运行

class H
{
public:
	H(string name, int age)
	{
		this->Name = name;
		this->Age = age;
	}
	string Name;
	int Age;
};


template<typename H>
bool spr(H a, H b) {
	if (a == b)
		return true;
	else
		return false;
}

int main() {
	char a = 'a';
	char b = 'b';
	H h01 = { "道枝骏佑",19 };
	H h02 = { "白敬亭",28 };
	if (spr(h01, h02)) {
		cout << "h01 == h02!" << endl;
	}
	else {
		cout << "h01 != h02" << endl;
	}
	system("pause");
	return 0;
}

image.png

4.具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型

class L
{
public:
	L(string name, int age)
	{
		this->Name = name;
		this->Age = age;
	}
	string Name;
	int Age;
};
template<typename H>
bool spr(H &a, H &b) {
	if (a == b)
		return true;
	else
		return false;
}
template<>bool spr(L &a, L &b) {
	if (a.Name == b.Name && a.Age == b.Age)
		return true;
	else
		return false;
}
int main() {
	char a = 'a';
	char b = 'b';
	L h01 = { "道枝骏佑",19 };
	L h02 = { "白敬亭",28 };
	bool ret = spr(h01, h02);
	if (ret) {
		cout << "h01 == h02!" << endl;
	}
	else {
		cout << "h01 != h02" << endl;
	}
	system("pause");
	return 0;
}

输出:

h01 != h02 请按任意键继续. . .

5.函数重载

函数重载的概念

  • 是C++的特色,允许一个程序中定义多个同名函数,但函数的参数列表(也称为特征标)必须不同。
  • 可以通过函数重载,使函数根据不同类型的参数实现不同的功能(相同的也行)。编译器会按照调用函数的参数个数和类型,决定使用哪个同名函数。
  • 参数类型和个数完全匹配的同名函数将被优先使用;如果参数类型没有完全匹配,则查找能够通过强制类型转换达成要求的同名函数。否则会报找不到函数的错误。

注意: 函数重载必须是参数列表不同,函数返回类型不能作为重载依据。编译只会根据函数名和参数列表,对函数名进行区分。

二义性

函数重载容易出现的问题就是二义性,即编译器不能根据参数区分同名函数。下面是几种常见的情况。

强制类型转换

如果实参与参数列表不完全匹配,编译器在强制类型转换时,容易出现二义性