【C++初阶】模板进阶
创始人
2024-05-02 06:40:09
0

文章目录

  • 非类型模板参数
  • 模板特化
    • 函数模板特化
    • 类模板特化
      • 全特化
      • 偏特化
  • 模板的分离编译
  • 模板总结
  • 所有测试的代码

非类型模板参数

模板参数分类类型形参与非类型形参
1.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
2.非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
在这里插入图片描述
在这里插入图片描述
注意:
1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2.非类型的模板参数必须在编译期就能确认结果。

模板特化

函数模板特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理。
在这里插入图片描述
在这里插入图片描述
函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给
出。

类模板特化

全特化

全特化即是将模板参数列表中所有的参数都确定化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

偏特化

偏特化有以下两种表现方式
1.部分特化
将模板参数类表中的一部分参数特化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.参数更进一步的限制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模板的分离编译

概念
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义(这样是不行的,在链接的时候编译器会报错)
解决方法

  1. 将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的。推荐使用这种。
  2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。

模板总结

在这里插入图片描述

所有测试的代码

//template
//void Swap(const T& a, const T& b)
//{
//	cout << "Swap(const T& a, const T& b)" << endl;
//}
//template<>
//void Swap(const int& a, const int& b)
//{
//	cout << "Swap(const int& a, const int& b)" << endl;
//}
//void test_function_Special()
//{
//	//函数模板特化
//	double x1 = 0;
//	int x2 = 0;
//	double y1 = 0;
//	int y2 = 0;
//	Swap(x1, y1);
//	Swap(x2, y2);
//}
//template
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};//template<>
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	int d1;
//	double d2;
//};//template
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//template
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	int d1;
//	T2 d2;
//};//template
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//template
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//void test_calss_Special()
//{
//	全特化
//	//Date T1;
//	//Date T2;
//	//Date  T3;
//	//偏特化
//	Date T4;
//	Date T5;
//	Date T6;
//	Date T7;
//}
//int main()
//{
//	//test_function_Special();
//	test_calss_Special();
//	return 0;
//}非模板类型参数
//template
//class arry
//{
//private:
//	//创建一个静态数组
//	T a[N];
//};
//int main()
//{
//	arry arr;
//	return 0;
//}

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...