news 2026/6/18 11:40:32

C++之模板(初级)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++之模板(初级)

1 模板的出现来源

1 泛型编程

我们先思考一个问题如何实现一个通用的交换函数呢?

int Swap(int& a,int& b ) { int temp=a; a=b; b=temp; } double Swap(double& a,double& b ) { doubletemp=a; a=b; b=temp; } ........

你会发现要是用之前函数重载的方式是可以实现的。但是却会面临一下两个问题
1. 重载的函数仅仅是类型不同,代码复用率比较低只要有新类型出现时,就需要用户自己增加对应的函数

2. 代码的可维护性比较低,一个出错可能所有的重载均出错

那我是否可以告诉编译器一个模板,然后让它自己推导出我想要的函数从而提高代码的复用率呢?

而在c++中确实存在这样的一个模具使得代码复用率大大提高它就是----模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
模板也分为两种:1 函数模板 2 类模板

2 函数模板

1 函数模板的概念

函数模板是指一个函数家族,这个家族代码逻辑相同但是参数的类型不相同,在使用时,编译器通过实参去推导参数的类型

2 函数模板的形式

template<class/typename T1(可以取任意名称),class/typename T2,class/typename T2,......>
返回值类型 函数名 (参数列表)

例如:

template<class T> void Swap(T& a,T&b) { T temp = a; a=b; b=temp; }

注意:class和typename都可以用来定义模板参数的关键字

3 函数模板的原理

函数模板不是一个函数,它只是一个模具/蓝图,在编译阶段根据你传的参数来推导出类型实例化出真正的函数,模板的出现真正的改变了cpp的开发效率让它只是把我们之前因该重复做的事情交给了编译器


4 函数模板实例化

用不同类型的参数使用函数的时候,称为函数模板实例化。模板实例化分为:1 隐式实例化 2显示实例化
1 隐式实例化:根据你传的参数推导

2显示实例化:在函数名后加<>自己指定模板参数类型

#include <iostream> using namespace std; template<class T> void Swap(T& a,T& b) { T temp=a; a=b; b=temp; } int main() { int a=1,b=2; //隐式实例化 Swap(a,b); //显示实例化 Swap<int> (a,b); return 0; }

5 模板参数的匹配原则


1 一个非模板函数可以和一个同名的函数模板同时存在,而且改函数模板还可以被实例化成那个同名非模板函数

#include <iostream> using namespace std; //int 类型的加法函数 int Add(int a,int b) { return a+b; } //通用的加法函数 template<class T> T Add(T a,T b) { return a+b; } int main() { Add(1,2);// 与非模板函数匹配,编译器不需要特化 Add<int> (1,2);// 调用编译器特化的Add版本 return 0; }

2 对于非模板函数和同名的模板函数,如果条件相同的情况下,在调用时会优先调用非模板函数不会用模板函数实例出一个函数。如果模板可以更好的匹配参数那么编译器会选择将模板实例化
3 模板不允许自动转化类型,因为参数传什么类型模板就自动推导什么类型不会有什么类型转化的概念,但是普通函数可以类型转化

3 类的模板

1 类模板定义的格式:

template<class T1,classT2....,class Tn> class 类名 { //类成员定义 };

2 类模板的实例化

类模板实例化和函数模板实例化不同,类模板实例化是在类名后面加<>,然后将实例化的参数放在<>中间就可以了,类模板的名字不是真正的类只有实例化出来的结果才是真正的类

#include <iostream> using namespace std; template<class T> class A { public: A(T a) :_a(a) { } private: T _a; }; int main() { //实例化出int类型的A类 A<int> a; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 8:56:22

比起会写 Prompt,未来更值钱的是定义目标的能力

过去两年&#xff0c;AI 圈有一个特别有意思的现象。刚开始大家都在研究 Prompt&#xff0c;各种“神级提示词”、“万能模板”、“一句话让 AI 效果提升 10 倍”的内容层出不穷。那时候很多人觉得&#xff0c;谁更会写 Prompt&#xff0c;谁就更懂 AI。但最近半年&#xff0c;…

作者头像 李华
网站建设 2026/6/6 8:56:18

ESP8266+STM32获取网络时间的两种方法对比:HTTP API vs NTP协议

ESP8266STM32网络授时方案深度对比&#xff1a;HTTP API与NTP协议实战解析在物联网设备开发中&#xff0c;精确的时间同步往往是功能实现的基础需求。无论是智能家居中的定时场景&#xff0c;还是工业环境下的数据采集&#xff0c;准确的时间戳都至关重要。对于STM32ESP8266这类…

作者头像 李华
网站建设 2026/6/6 8:53:15

肯德基在线点餐API接口

请求参数说明store_idstring是1店铺IDstore_codestringBAI001门店ID。外送模式不用传&#xff0c;会按经纬度匹配门店lng收货地址经度&#xff0c;外送模式必传lat收货地址纬度&#xff0c;外送模式必传order_typenumber否配送方式&#xff1a;1到店自取2外卖

作者头像 李华