模板初阶(1):函数模板,类模板

一、函数模板

1.1 概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

格式: template <typename T>或 template <class T>

cpp 复制代码
template <class T>
void Swap(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 1, b = 2;
	double d1 = 1.2, d2 = 2.1;

	Swap(a, b);
	Swap(d1, d2);
    
	return 0;
}
1.2 函数模板的原理

在编译阶段 ,编译器需要根据传入实参的类型推演生成对应类型的函数。

1.3 函数模板的实例化

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

1. 隐式实例化:编译器根据传入实参的类型推演生成对应类型的函数

如上:Swap()。

cpp 复制代码
template <class T>
T Add(const T x, const T y)
{
	return x + y;
}

int main()
{
	int a1 = 1;
	double d1 = 2.0;

    // error
    // Add(a1, d1); // 1. Add(a1, (int)d1); 2. 显式实例化
	return 0;
}
2. 显式实例化:在函数名后的<>中指定函数模板的参数类型
cpp 复制代码
template <class T>
T Add(const T x, const T y)
{
	return x + y;
}

int main()
{
	int a1 = 1;
	double d1 = 2.0;

	Add <double>(a1, d1);// 显式实例化

	return 0;
}

二、类模板

2.1 类模板格式
cpp 复制代码
template <class T1, class T2, ..., class Tn>
class 类模板名
{
    // 类成员定义
};

E.g.

cpp 复制代码
template <class T1>
// typedef int STDateType    

class Stack// Stack不是具体的类,是编译器根据被实例化的类型生成的具体类的模具
{
public:
	Stack(int capacity = 3)
		:_top(0)
		, _capacity(capacity)
	{
		cout << "Stack(int capacity = 3)" << endl;
        // _a = new STDateType[capacity];
		_a = new T1[capacity];
	}

	~Stack()
	{
		cout << "~Stack()" << endl;
		delete _a;
		_top = _capacity = 0;
	}
private:
    // STDateType* _a;
	T1* _a;
	int _top;
	int _capacity;
};
相关推荐
码途行者10 分钟前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光33 分钟前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字1 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
fish_zzzz1 小时前
笔记-论数据结构2
1024程序员节
老秦包你会2 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光2 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Wang's Blog11 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain12 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67812 小时前
深挖C++:类和对象(中)
开发语言·c++