IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 【模板】 -> 正文阅读

[C++知识库]C++ 【模板】

目录

1. 函数模板

2. 类模板

3.非类型模板参数

4.模板特化

类模板特化


1. 函数模板

语法

 template<typename T1,typename T2....>

(模板参数可以做返回值、做参数、在函数中使用)

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

一个通用Swap函数模板

template<typename T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

T代表自定的类型,具体类型传参后编译器对应替换成对应类型,不同类型是不同函数

隐式实例化和显式实例化

不同类型的参数使用函数模板时,称为函数模板的实例化

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	//隐式实例化,让编译器自动推演
	//Add(1.0, 2);报错,编译器推演实例化无法推导,一个double一个int无法对应一个T
	Add((int)1.0, 2);
	Add(1.0, (double)2);

	//显式实例化,<>是指定模板参数T的类型,主动告诉编译器
	Add<int>(1.1, 2);
	Add<double>(1.1, 2);
	return 0;
}

非模板函数可以和同名的函数模板同时存在(优先调用非模板函数),而且该函数模板还可以被实例化为这个非模板函数


2. 类模板

template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
};

注意事项:

1.函数调用实参传给形参还可以推导类型,但类模板都得显示实例化

2.类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

3.类模板不支持分离编译(声明.h,定义.cpp),可以在当前文件声明定义分离,类模板中函数放在类外进行定义时,需要加模板参数列表,申明模板参数

template <class T>//申明模板参数
Vector<T>::~Vector()
{
 if(_pData)
 delete[] _pData;
 _size = _capacity = 0;
}

4.模板也可以给缺省参数,给的是类型

3.非类型模板参数

用一个常量作为类/函数模板的一个参数,在类/函数模板中可将该参数当成常量来使用?

template<class T,size_t N = 10>
class Array
{

private:
	T _array[N];
};

浮点数、类对象以及字符串是不允许作为非类型模板参数,一般允许整形家族

非类型的模板参数必须在编译期就能确认结果

补充:C11新增array容器,等价于C语言中的数组,其作用是更加严格的越界检查

4.模板特化

通常情况下,使用模板可以实现不同逻辑,但对于一些特殊类型的逻辑可能会得到一些错误的结果,这时需要特殊处理在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。

模板特化中分为函数模板特化与类模板特化

特化注意事项:

1.不能单独存在,必须要先有一个基础的函数模板

2.关键字template后面接一对空的尖括号<>

3.函数名后跟一对尖括号,尖括号中指定需要特化的类型

函数模板特化

实现一个用来进行小于比较的函数模板

template<class T>
bool Less(T left, T right)
{
 return left < right;
}

可以比较(1,2),可以比较Date(重载operator<即可),无法比较取地址后日期类的两个类大小

写法:针对Less的特殊处理:当Date*调用Less时,走下面的函数模板特化

template<class T>
bool Less(T left, T right)
{
     return left < right;
}

// 对Less函数模板进行特化

template<>
bool Less<Date*>(Date* left, Date* right)
{
    return *left < *right;
}

类模板特化

与上文同理,例如less/greater仿函数中遇到取地址指针比较,此时特化即可

或者容器中存放的是指针,传入仿函数,内部数据需要解应用进行比较大小的话也需要特化

注意类型匹配


	template<class T>
	struct less
	{
		bool operator()(const T& x1, const T& x2) const
		{
			return x1 < x2;
		}
	};

	// 特化
	template<>
	struct less<Date*>
	{
		bool operator()(Date* x1, Date* x2) const
		{
			return *x1 < *x2;
		}
	};

类模板全特化

将模板参数列表中所有的参数都确定化

template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

template<>
class Data<int, char>//将模板参数列表中所有的参数都确定化
{
public:
	Data() { cout << "Data<int, char>" << endl; }

};

int main()
{
	Data<int, int> d1;//正常
	Data<int, char> d2;//走特化
	return 0;
}

类模板偏特化

?任何针对模版参数进一步进行条件限制设计的特化版本

template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

template<class T1>
class Data<T1, char>
{
public:
	Data() { cout << "Data<T1, char>" << endl; }

};

int main()
{
	Data<int, char> d1;//走特化
	Data<char, char> d2;//走特化,因为<>中包含所需特化参数
    Data<char, int> d3;//正常模板参数,因为<>中不包含所需特化参数
	return 0;
}

更进一步偏特化,模板参数只要是指针就特化为该类特化

//两个参数偏特化为指针类型
template <class T1, class T2>
class Data <T1*, T2*>
{
public:
	Data() { cout << "Data<T1*, T2*>" << endl; }
};

?

?模板参数还能是引用,或者引用/指针

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:06:35  更:2022-11-05 00:11:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:21:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码