C++模板

2023-05-16

函数模板

1.把类型当作未知量

2.语法

template <typename _Ty>
_Ty function(_Ty a,_Ty b)
{
   return a>b?a:b;
}

template <class _Ty1,class _Ty2>
void print(_Ty1 a,_Ty2 b)
{
   cout<< a << b <<endl;
}

3.调用

(1)隐式调用

(2)显示调用:函数名<类型名>(参数)

#include <iostream>
#include <string>
using namespace std;
template <class _Ty1,class _Ty2>
void print(_Ty1 a,_Ty2 b)
{
   cout<< a << b <<endl;
}
int main()
{
   print(1,2);//隐式调用
   print<string,string>("aa","bb");//显示调用
   return 0;
}

4.函数模板的两种形态

(1)普通函数当作函数模板

(2)类的成员函数当作模板,类外声明不可省略

5.函数模板特殊写法

(1)缺省写法,显示调用时,可以少传类型,但不可少参数

(2)存在一个常量类型。不缺省,不能隐式调用

#include <iostream>
#include <string>
using namespace std;
template <class _Ty1,class _Ty2=int>
void print(_Ty1 a, _Ty2 b)
{
	cout << a << "\t" << b << endl;
}

class A
{
public:
	template <class _Ty>
	void print1(_Ty data)
	{
		cout << data << endl;
	}
	template <class _Ty>
	void print2(_Ty data);
protected:
};
template <class _Ty>
void A::print2(_Ty data)
{
	cout << data << endl;
}

template <class _Ty1,size_t size/*unsigned int*/>
void printarr(_Ty1 array)
{
	for (int i = 0; i < size;i++)
	{
		cout << array[i] << "\t";
	}
}
int main()
{
	A a;
	a.print2(123);
	print<string>("aaa", 123);
	int arr[3] = { 1, 2, 3 };
	printarr<int*, 3>(arr);
	return 0;
}

类模板

1.声明

template <class _Ty>
class A
{
public:
protected:
};

2.必须要显示调用

3.类模板不是实际的类:类名<未知类型>

#include <iostream>
#include <string>
using namespace std;
template <class _Ty>
class Data
{
public:
	Data(){}
	Data(string str) :str(str){}
	void print();
protected:
	string str;
};
template <class _Ty>
void Data<_Ty>::print()
{
	cout << str << endl;
}
template <class _Ty>
class data : public Data<_Ty>
{
public:
	data(string str) :Data<_Ty>(str){};
protected:
};
template < class _Ty1,class _Ty2>
class AA
{
public:
	AA(_Ty1 one, _Ty2 two) :one(one), two(two){}
	void Print();
protected:
	_Ty1 one;
	_Ty2 two;
};
template < class _Ty1, class _Ty2>
void AA<_Ty1, _Ty2>::Print()
{
	cout << one << "\t" << two << endl;
}
int main()
{
	Data<int> a;
	data<int> b("bbb");
	b.print();
	AA<string, int> aa("aaa", 123);
	aa.Print();
	return 0;
}

自定义类型当作模板参数

1.基本自定义类型

2.自定义类型也是一个模板

3.重载运算符

#include <iostream>
#include <string>
using namespace std;
class Boy
{
public:
	Boy(string name, int age) :name(name), age(age){}
	friend ostream& operator<<(ostream& out,Boy& boy)
	{
		out << boy.name << "\t" << boy.age;
		return out;
	}
	bool operator>(Boy boy)
	{
		return this->age > boy.age;
	}
protected:
	string name;
	int age;
};
template <class _Ty>
void print(_Ty one)
{
	cout << one << endl;
}
template <class _Ty>
_Ty Max(_Ty one,_Ty two)
{
	return one > two ? one : two;
}
int main()
{
	print(Boy("name0", 0));
	Boy boy1("name1", 1);
	Boy boy2("name2", 2);
	Boy result=Max(boy1, boy2);
	cout << result << endl;
	return 0;
}

模板的嵌套

#include <iostream>
#include <string>
using namespace std;
template <class _Ty1,class _Ty2>
class Boy
{
public:
	Boy(_Ty1 name, _Ty2 age) :name(name), age(age){}
	friend ostream& operator<<(ostream& out, Boy& boy)
	{
		out << boy.name << "\t" << boy.age;
		return out;
	}
protected:
	_Ty1 name;
	_Ty2 age;
};
template <class _Ty>
void print(_Ty temp)
{
	cout << temp << endl;
}
template <class _Ty1,class _Ty2>
class Data
{
public:
	Data(_Ty1 one, _Ty2 two) :one(one), two(two){}
	void print()
	{
		cout << one << "\t" << two << endl;
	}
protected:
	_Ty1 one;
	_Ty2 two;
};
int main()
{
	//隐式调用
	print(Boy<string, int>("name0", 0));
	//显示调用
	print<Boy<string,int>>(Boy<string, int>("name1", 1));
	//类嵌套
	Data<Boy<string, int>, Boy<double, double>> 
		data(Boy<string, int>("name2", 2), Boy<double, double>(0, 1));
	data.print();
	return 0;
}

模板重载

1.优先调用普通函数

2.其次调用相似度高的模板函数

#include <iostream>
#include <string>
using namespace std;
void print(string a, int b)
{
	cout << "普通函数" << endl;
}
template <class _Ty>
void print(_Ty a, _Ty b)
{
	cout << "一个未知类型" << endl;
}
template <class _Ty1,class _Ty2>
void print(_Ty1 a, _Ty2 b)
{
	cout << "两个未知类型" << endl;
}
int main()
{
	print(string("aa"), 11); //普通函数
	print(11, string("aa"));//两个未知类型
	print(string("aa"), string("aa"));//一个未知类型
	return 0;
}

模板特殊化

//原先模板
class A
{
public:
protected:
};
//局部特殊化处理
template <class _Ty>
class A<_Ty,_Ty>
{
public:
protected:
};
//完全特化
template <>
class A<string,string>
{
public:
protected:
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++模板 的相关文章

  • java8的list分组-类字段分组-及分组后排序

    jdk8 java8 xff0c list 集合 分组 xff0c stream 流处理 xff0c groupingBy 使用 为了实现 分组后排序 xff0c 增加 sorted 使用 xff0c 先排序在分组 xff0c 就能保证 分
  • 实现微信小程序和手机app远程控制51单片机控制L298N电机驱动器控制马达(ESP8266 AT89S52 http请求转串口通信系统 mqtt )

    首先你有这样的8266 这种8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 还有就是你需要有一个51单片机或者其他芯片都行 有了这2个芯片我们开始吧 xff01 1 先看一段视频效果演示 xff0c 再来介绍实现步骤
  • play() failed because the user didn‘t interact with the document first

    使用js调用音频文件报错 xff0c 错误信息如下 xff1a play failed because the user didn t interact with the document first 翻译 xff1a play方法调用失败
  • 电脑蓝屏:KERNEL_SECURITY_CHECK_FAILURE 分析

    此KERNEL SECURITY CHECK FAILURE bug 检查的值为 0x00000139 此 bug 检查指示内核检测到关键数据结构损坏 引起电脑蓝屏问题的topsecpf sys xff0c 删除 LIST ENTRY损坏可
  • springBoot集成mybatis使用ResultHandler返回map数据类型

    在 springBoot 的 web 项目中 xff0c 平时查询数据返回都是 xff1a 集合 list 实体类 bean 数量 int long 如果返回 map xff0c 也是Map lt String Map lt String
  • java测试示例-生成ULID

    ULID全称Universally Unique Lexicographically Sortable Identifier xff0c 直译就是通用唯一按字典排序的标识符 xff0c 原始仓库是https github com ulid
  • jdk8-获取本机ip、判断ip范围、ip与long互转等

    在配置nginx的ip白名单时候 xff0c 会通过ip段进行配置 xff08 如 10 10 10 10 24 xff09 就在思考这种配置怎么通过代码解析并判断 xff0c 故通过搜索网络内容 xff0c 并通过java编写测试代码 代
  • python3通过文件头判断文件类型

    最近 xff0c 在学习python3中 xff0c 感觉入门挺简单 xff0c 毕竟本身是java开发 xff0c 很多容易理解一些东西 这几天对文件类型的验证有点想法 xff0c 就在网上搜索 xff0c 是找到了很多博客 xff0c
  • mysql数据数据表的排序规则修改

    在工作中同事遇到的问题 xff0c 是找一种简便的方法批量修改数据表字段的排序规则 xff0c 在MySQL中叫collation xff0c 和编码CHARACTER一起出现的 collation有三种级别 xff0c 分辨是数据库级别
  • linux 普通用户sudo无需手动敲密码

    普通用户在执行一些root权限的操作时 xff0c 需要用到sudo命令来执行 xff0c 同时需要手动输入密码 xff0c 比较繁琐 xff0c 下面的操作来减少手动输入密码 1 visudo命令编辑 etc sudoers文件 sudo
  • Qt QFile 删除文件最后n个字节的数据

    QFile无需打开文件 xff0c 即可删除文件最后面的n个字节的数据 方法很简单 xff0c 可以通过QFile自带的resize函数进行大小的处理 resize size 如果 size的大小大于file的大小 xff0c file后面
  • Qt中通过C++ 实现udp广播报文

    Qt UDP消息交互 udp广播原理介绍客户端实现方法客户端思路实现代码 服务端实现方法服务端思路实现代码 udp广播原理介绍 UDP是面向非连接的网络交互协议 xff0c 在UDP交互中 xff0c 存在客户端和服务端 xff0c 客户端
  • 实现手机app和微信小程序和树莓派智能音箱远程控制arduino获取甲醛温湿度和控制灯(esp8266 ZE08-CH2O DHT11 MQTT 语音识别 语言合成 http请求转串口通信系统 )

    首先你有这样的esp8266 这种esp8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 需要有一个arduino uno 连接甲醛探测器和温湿度探测器 或者其他芯片都行 还有就是你要有树莓派和usb麦克风 xff0c
  • 什么是法线贴图?

    什么是法线贴图技术呢 xff1f 这是一种用来实现3D效果的一种技术 xff0c 要想理解这种技术还请您听我慢慢道来 我们知道 xff0c 在游戏中经常会有这样的情况 xff0c 就是一个平面 这个平面在现实中并不是一 个 平 面 xff0
  • 串口中断收发定长数据

    一 实验设计效果 配置串口助手波特率为115200 xff0c 传输数据长度为8 Bit xff0c 无奇偶校验位 xff0c 1个停止位 xff1b 通过串口助手向MCU发送指定长度的字符串 xff0c MCU接收到指定长度的字符串后 x
  • Qt 中C++ async实现并行处理

    在项目中 xff0c 难免遇到性能问题 xff0c 为了提高处理的性能 xff0c 针对可以并行处理的部分单独提取出来 xff0c 利用并行编程来提高处理的速度 xff0c 从而实现高性能 C 43 43 11中有一个async 函数 xf
  • 深度学习环境入门之手写数字识别

    在自己的windows环境下配置好了深度学习的环境 xff0c 本文主要记录一下用深度学习的环境下实现一个简单的手写数字识别的模型训练和使用 1 在pycharm中配置conda环境 xff1a 环境配置好以后 xff0c 可以开始手写数字
  • 算法之KMP算法 全新思路介绍!

    KMP算法是一个经典的字符串匹配算法 xff0c 也是一种常用的字符串匹配算法 在KMP算法没出现之前 xff0c 大家在字符串匹配的时候 xff0c 都是两个for循环嵌套完成字符串之间的匹配 这种算法称作 BF算法 xff08 暴力求解
  • c++ linux utf-8 编码 中文汉字分割(超简单代码)

    UTF 8 编码对于英文字母 xff0c 占用一个字节 xff1b UTF 8 编码对于中文字母 xff0c 占用多个字节 xff0c 最大占用6个字节 xff0c 其中第一个字节二进制的最高位连续1的个数来表示占用字节的个数 xff0c
  • 算法之并查集

    并查集 xff0c 顾名思义 xff0c 就是合并不同的集合 xff0c 并查集是一种集合合并和查找算法 这是一种思想很奇妙的算法 xff0c 学会它 xff0c 在你后续的程序学习中可以有很多的可以用的地方 什么是并查集 xff1f 举个

随机推荐

  • 算法之主成分分析PCA详解(包含理论推导和代码)

    1 PCA介绍 主成分分析算法 xff08 Principal Component Analysis xff09 简称PCA xff0c 是一种常用的统计方法 该方法对高维的数据进行筛选 xff0c 选出最具有代表性最重要的的几维数据 xf
  • linux 命令行进行桌面图标的打开

    近期在处理一个需求 xff0c 需要在代码中打开桌面的某个图标 xff0c 因此 xff0c 做了一些搜索 xff0c 最终发现 xff0c 有两个比较好用的命令 xff0c 下面来讲解一下 1 gtk launch 在linux系统一般已
  • 算法之滑动窗口寻找最长无重复字符串

    今天无聊的时候刷了一道leetcode的题目 xff0c 给定字符串 xff0c 查找最长无重复字符串 xff0c 具体题目信息如下 xff1a 给定一个字符串 s xff0c 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入
  • 算法之图解单纯形算法C++

    在之前的算法博客中 xff0c 结合案例和算法的图形表示 xff0c 获得了较多同学的好评 xff0c 例如之前写的迪杰斯特拉算法这篇博客 xff0c 能够让很多新同学和老同学通过直观的方式去理解算法求解的过程 xff0c 这样理解起来会比
  • linux opencv打开两个USB摄像头

    在ubuntu linux系统下 xff0c 摄像头设备是通过 dev videox来表示的 xff0c 如果只有一个摄像头 xff0c 则会在 dev目录下显示 video0和video1两个设备 xff0c 其中 xff0c video
  • 实现手机app和微信小程序远程控制加人体探测自动化控制51单片机打开流水灯(ESP8266 STC89C52RC http请求转串口通信系统)

    首先你有这样的8266 这种8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 有一个51单片机 或者其他芯片都行 还有就是需要这种人体红外探测模块和led灯 有了这2个芯片我们开始吧 xff01 1 先看一段视频效果演示
  • 图像算法之图像平移

    在图像处理领域中 xff0c 图像变换是最基本的算法 xff0c 本文主要详细分享一下图像平移算法的原理和代码实现 xff0c 废话不多说 xff0c 直接上干货 1 图像平移的原理 在计算机图像中 xff0c 主要是用的是 像素直角坐标系
  • OpenCV之Mat的详细介绍

    在opencv中 xff0c Mat作为图像的存储容器 xff0c 是非常基础也是非常重要的知识 xff0c 本文主要介绍Mat相关的操作 1 图像复制 再开始将拷贝之前 xff0c 先给大家分享一下浅拷贝和深拷贝 浅拷贝 xff1a 拷贝
  • windows下Linaro-arm-linux编译开启NEON的Opencv源码详细过程

    环境配置 1 windows安装cmake 下载地址 xff1a https cmake org download 按照上图中的下载cmake的安装包 xff0c 安装注意事项如下 xff1a 安装路径切记不能包含空格 xff01 xff0
  • Windows 工具之net

    net 是windows平台下用户管理的工具 xff0c 可以来添加 xff0c 删除和修改用户 1 创建用户 xff1a win 43 R 输入cmd xff0c 然后打开命令行窗口 xff0c 输入下面的命令 xff1a net use
  • windows平台相关命令收集

    1 获取IP地址命令 xff1a ipconfig 2 获取MAC地址命令 xff1a ipconfig all 3 查看所有端口信息 netstat nal findstr 8080
  • C/C++中比较好用的HTTP开源库

    以下是一些常用的C C 43 43 开源HTTP库及其对应的开源协议和链接 xff1a 1 libcurl xff1a 使用MIT X开源协议 xff0c 支持多种协议和多种数据传输方式 xff0c 被广泛应用于各种开发场景 官网链接 xf
  • 为Ubuntu网页设置稳定的数据隧道

    网站作为互联网世界中的一个个门户 xff0c 是我们对外表达的窗口 xff0c 无数个人和企业通过这个窗口传递着信息 xff0c 这个传递信息的窗口必须稳定持续存在 xff0c 才能让更多访客看到 xff0c 为我们带来更多的流量 而使用c
  • VisualStudio配置与Matlab混合编译问题总结

    VisualStudio配置与Matlab混合编译问题总结 写这篇博客记录一下自己在配置过程中遇到的种种问题 xff0c 也做一个小小总结 xff0c 试图把整个过程讲明白 xff0c 希望对面临同样问题的人有所帮助 网上此类教程很多 xf
  • C++与C的区别(作业)

    头文件的区别 1 C 43 43 中创建源文件后缀为 cpp xff0c C语言中创建源文件后缀为 c xff0c 头文件保持不变 xff0c 后缀为 h 2 包含自己的头文件 xff0c C语言与C 43 43 无区别 包含库目录 xff
  • C++和C语言区别(二)附二级指针的动态内存申请

    结构体区别 1 定义结构体与C语言一致 2 定义变量可省略关键字struct 3 C 43 43 结构体中允许函数存在 xff08 C 43 43 在没有写构造函数和权限限定的时候 xff0c 用法和C语言一致 xff09 xff08 1
  • 自制芯片 http转串口通信模块实现手机控制加红外控制51单片机实现双控制 28BYJ-48步进电机( 13003步进电机驱动器 STC89C52RC ESP8266)

    首先你有这样的8266 这种8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 还需要有一个51单片机 或者其他单片机都行 还有就是需要这样的13003步进电机驱动器 43 28BYJ 48步进电机和红外接收头以及遥控器
  • C++类和对象(附C语言与C++链表)

    类和对象的基本概念 1 类 xff1a 一系列事物的抽象 xff0c 万物皆可为类 xff08 1 xff09 属性 xff1a 事物的特征 数据类型的描述 xff08 2 xff09 行为 xff1a 事物的操作 函数描述 2 对象 xf
  • C++类的组合

    1 以另一个类的对象为数据成员 xff0c 必须采用初始化参数列表的写法 include lt iostream gt include lt string gt using namespace std class Boy public Bo
  • C++模板

    函数模板 1 把类型当作未知量 2 语法 template lt typename Ty gt Ty function Ty a Ty b return a gt b a b template lt class Ty1 class Ty2