c++模板

目录

函数模板

javascript 复制代码
template<typename T>
void  swapAll(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
	return;
}

void  demo1()
{
	double da = 2.5;
	double db = 2.3;
	swapAll(da, db);
	cout << "da : " << da << " db: " << db << endl;

	int a = 10;
	int b = 20;
	swapAll(a, b);
	cout << "a : " << a << " b:" << b<<endl;
}

如上面代码所示,首先 template<typename T> 这个模板的范围仅限于 void swapAll(T& a, T& b) 这个函数。

函数模板会编译两次,第一次是对模板本身编译,第二次,函数调用出,将T的类型具体化。

函数模板自动类型推导时,不能对函数的参数进行自动类型转换。

在实际使用中,可能会出现模板函数和非模板函数的重载,

所以我们换了一种写法来强制使用模板函数。

javascript 复制代码
void  demo2()
{
	int a2 = 10;
	int b2 = 20;
	swapAll<int>(a2,b2);

	double da2 = 1.1;
	double db2 = 2.2;
	swapAll<double>(da2, db2);
}

函数模板的局限性

当函数模板推导 T 为数组或者其他自定义类型数据,可能导致运算符不识别。

javascript 复制代码
template<typename T>
void  myPrintAll(T a)
{
	cout<<a<<endl;
}

如上面代码所示,如果 T 是一个自定义类的类类型,代码执行可能会出问题,所以这种情况下就要在类里面编写重载运算符函数。

类模板

类模板,类模板实例化对象,不能自动类型推导(重要)

javascript 复制代码
//类模板,类模板实例化对象,不能自动类型推导(重要)
template<class T1,class T2>
class Data
{
private:
	T1 a;
	T2 b;
public:
	Data() {}
	Data(T1 tmpa, T2 tmpb)
	{
		this->a = tmpa;
		this->b = tmpb;
	}
	void showData()
	{
		cout << a << " " << b << endl;
	}
};

void demo3()
{
	Data<int, int> ob1(10,20);
	ob1.showData();
	Data<int, char> ob2(10,'A');
	ob2.showData();

}

类模板的成员函数在类外实现

//类模板,类模板实例化对象,不能自动类型推导(重要)

javascript 复制代码
template<class T1, class T2>
class Data
{
private:
	T1 a;
	T2 b;
public:
	Data() {}
	Data(T1 tmpa, T2 tmpb)
	{
		this->a = tmpa;
		this->b = tmpb;
	}
	void showData();
	
};

template<class T1,class T2>
void Data<T1,T2>::showData()
{
	cout << a << " " << b << endl;
}

模板类派生普通类

javascript 复制代码
template<class T1,class T2>
class Base
{
private:
	T1 a;
	T2 b;
public:
	Base(T1& tmpa, T2& tmpb)
	{
		this->a = tmpa;
		this->b = tmpb;
	}
	void showData();
};

template<class T1,class T2>
void Base<T1, T2>::showData()
{
	cout << a << endl;
	cout << b << endl;
}


class Son1 :public Base<int, char>
{
public:
	int c;
	Son1(int a, char b, int c) :Base<int, char>(a, b) {
		this->c = c;
	}
};

void demo1113()
{
	Son1 ob1(100, 'A', 200);
}

模板类派生模板类

javascript 复制代码
template<class T1,class T2,class T3>
class Son2 :public Base<T1, T2>
{
public:
	T3 c;
public:
	Son2(T1 tmpa, T2 tmpb, T3 tmpc) : Base<T1, T2>(tmpa, tmpb)
	{
		this->c = tmpc;
	}
};


void demo1113()
{
	//Son1 ob1(100, 'A', 200);
	Son2<int, string, double> ob2(1,"hello",2.3);
}
相关推荐
深入云栈1 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
爱笑的k111 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
wang_shu_mo_ran2 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
X1A0RAN2 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
量化分析码农3 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.3 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
熊猫钓鱼>_>4 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮4 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗4 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
Cosolar5 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github