C++泛型编程

范型编程

让编译器更具不同类型利用该模型生成代码(更具体类型无关的代码)

函数模板

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

cpp 复制代码
#include <iostream>

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

int main()
{

	int a=0, b=1;
	std::cout << "a:" << a << " b:" << b<<std::endl;
	Swap(a, b);
	std::cout << "a:" << a << " b:" << b;
	return 0;
}

typename时用来定义模板参数关键字的,也可以使用class(但是不能使用struct)

函数模板的原理

函数模板时一个蓝图,它本身不是函数,时编译器用使用方式产生特定类型函数的磨具。所以其实模板就是将本来应该做的重复的事情交给了编译器(也就是函数的重载)

隐式实例化:让编译器根据实参推演参数的实际模板(也就是上面的这种),但是如果有两个参数,编译器无法确定参数实例化

必须采用这两种办法:

  1. 使用显式实例化
  2. 用户自己来强制转化
cpp 复制代码
#include <iostream>

template<typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{

	int a = 1;
	double b = 2.5;
    int fault = Add(a,b);//编译器无法确定把T实例化成int还是double
	int c = Add<int>(a, b);//1.使用显式实例化
	double d = Add((double)a, b);//2.用户自己来强制转化

	std::cout << "c:" << c<<" d:"<<d;

	return 0;
}

函数模板的匹配原则

  1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化成这个非模板函数
  2. 对于非模板函数和同名函数模板,如果其他条件相同,在调用时会优先调用非模板函数。如果模板可以产生一个更匹配的函数,那么选择模板
  3. 模板函数不允许自动类型转换,到那时普通函数可以
cpp 复制代码
int Add(const int& left, const int& right)
{
	return left + right;
}

template<typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{

	int a = 1;
	int b = 2.5;
	int c = Add(a, b);		//和非模板函数匹配,编译器不需要特化
	int d = Add<int>(a, b); //调用编译器特化的Add版本
    Add(1, 1);//和非模板函数完全匹配,使用非模板函数
	Add(1, 2.5);//模板函数可以生成更加匹配的函数,编译器更具参数生成


	std::cout << "c:" << c;

	return 0;
}

类模板

类实例化不同类型,类名<数据类型>才是整个类的类型

cpp 复制代码
template <class T>
class Vector
{
public:
	Vector(size_t cap)
		:_p(new T [cap])
		,_size(0)
		,_cap(cap)
	{}

	~Vector();//类内定义,类外定义

	
private:
	T* _p;
	size_t _size;//有限元素个数
	size_t _cap;//容量
};

template <class T>
Vector<T>::~Vector()
{
	if (_p)
		delete[]_p;
	_size = _cap = 0;
}

int main()
{

	Vector<int> vv(9);

	return 0;
}
相关推荐
ghie9090几秒前
基于C#实现俄罗斯方块游戏
开发语言·游戏·c#
棱镜Coding1 分钟前
LeetCode-Hot100 27.合并两个有序链表
算法·leetcode·链表
燕山石头5 分钟前
java模拟Modbus-tcp从站
java·开发语言·tcp/ip
lixzest6 分钟前
C++工程师的成长
开发语言·c++·程序人生·职场和发展
总有刁民想爱朕ha9 分钟前
Python YOLOv8 进阶教程
开发语言·python·yolo
2301_7657031412 分钟前
C++中的策略模式应用
开发语言·c++·算法
TGITCIC13 分钟前
RAG不是魔法,是工程:从知识库到企业部署的硬核实践
人工智能·算法·机器学习·rag·ai agent·ai开发·rag增强检索
GHL28427109013 分钟前
*:端口 & 127.0.0.1:端口
运维·服务器·c++
王老师青少年编程14 分钟前
信奥赛C++提高组csp-s之树形DP详解及编程实例
c++·动态规划·树形dp·csp·信奥赛·csp-s·提高组
求梦82020 分钟前
【力扣hot100题】两两交换链表中的节点(25)
算法·leetcode·链表