C++模板

模板 是 泛型编程的基础

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段

函数模板

函数模板在使用时才会被参数、实例化,根据实参类型生成函数的特定版本

cpp 复制代码
template<class T>
// template<typename>
size_t multi(const T& a, const T& b)
{
	return a * b;
}

class & typename

在模板声明形参 T 时,class T 或者 typename T 是完全等价的,但如果有下面情况,必须用 typename

cpp 复制代码
template<typename T>
// template<class>
void print_list(const list<T>& lt)
{
	typename list<T>::const_iterator it = lt.begin();
	......
}

这是在 模板函数 print_list 中,包括了 模板类 list<T> :

const_iterator 是一个内嵌类型,即 嵌套在模板类 list<T> 中的内置类型;

编译器在实例化 list<T> 之前,不清楚 const_iterator 到底是一个内嵌类型,还是一个静态成员变量;

因为静态成员变量也有同样的突破类域的访问方式:类名::成员名 ,其实不仅静态成员变量,静态成员函数也是这样的访问方式;

所以回归问题,我们必须 使用typename 告诉编译器 const_iterator 是一个内嵌类型,等 list<T> 实例化之后,去实例化的类里面找。

模板 & 同名函数

cpp 复制代码
template<class T>
size_t multi(const T& a, const T& b)
{
	return a * b;
}
int multi(const int& left, const int& right)
{
	return left * right;
}

函数模板与同名函数同时存在,调用时,编译器能先调同名函数就会先调同名函数;

如果想指定调模板,那么需要显式实例化:

cpp 复制代码
	int a = 1, b = 2;
	multi<char>(a, b);    // 函数模板的显式实例化

显式实例化

除了上面提到 如果想指定调用函数模板需要显式实例化参数类型之外,还有一种情况:

cpp 复制代码
template<class T>
T& func(int n)
{
	return new T[n];
}

func<char>(10);    // 必须显式实例化

调用这个模板函数时,编译器无法通过你传入的参数来推理出 模板参数 T 是什么类型,所以必须显式实例化。

类模板

类模板必须显式实例化:

cpp 复制代码
template<class T>
class A
{
public:
	A()
		:_a(0)
		,_b(nullptr)
	{}
private:
	T _a;
	T* _b;
};

A<int> a;    // 类模板的显式实例化

这个类的类名是 A , 类型是 A<T>

类模板的使用 参考函数模板。

相关推荐
ambition2024217 分钟前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_19 分钟前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
2401_8274999932 分钟前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python
kebeiovo33 分钟前
atomic原子操作实现无锁队列
服务器·c++
PD我是你的真爱粉34 分钟前
MCP 协议详解:从架构、工作流到 Python 技术栈落地
开发语言·python·架构
Yungoal34 分钟前
常见 时间复杂度计算
c++·算法
6Hzlia41 分钟前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
星晨雪海1 小时前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言
ACP广源盛139246256731 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
Ricky_Theseus2 小时前
C++右值引用
java·开发语言·c++