C++初识模板

这篇具有很好参考价值的文章主要介绍了C++初识模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++初识模板,C++,原创,c++,开发语言

👑1. 泛型编程

void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
void Swap(double& a, double& b)
{
	double tmp = a;
	a = b;
	b = tmp;
}
void Swap(char& a, char& b)
{
	char tmp = a;
	a = b;
	b = tmp;
}

上面这段代码,是一个交换函数的重载,这虽然可以处理不同的类型,但是每个类型都要我们写对应的重载函数,而且复用率不是很高。

祖师爷可能也感觉这样不好用,设计了模板这个概念,就类似于印刷术,有一个模子在这里,想怎么印刷就怎么印刷。

C++初识模板,C++,原创,c++,开发语言

泛型编程是一种编程范式,编写与特定类型无关的算法和数据结构,使其可以适用于多种数据类型,而无需为每种类型编写特定的代码。

在C++中,主要就通过模板来实现。

👒2. 模板

📿2.1 函数模板

函数模板是一种用于生成通用函数的模板。它允许在函数定义中使用类型参数,以便函数可以适用于多种数据类型。函数模板的语法如下:

template<typename T>
void func(T x)
{
	//...
	//
	//...
}

这里的template也可以用class来代替

typename是定义函数模板的关键字

🎶2.11 类型推理

函数模板类似一张图纸,它本身并不是函数,是编译器会根据函数调用时候传递的参数类型进行推导,找到最匹配的模板参数类型。

template<typename T>
T Max(T a, T b)
{
	return a > b ? a : b;
}
int main()
{
	cout << Max(1, 3) << endl;
	cout << Max(2.2, 1.3) << endl;
	cout << Max('a', 'b') << endl;
	return 0;
}

这段代码就会根据参数的不同类型,推导适合这些参数的模板参数。

C++初识模板,C++,原创,c++,开发语言

🎶2.12 函数模板实例化

这些都是调用的同一个函数吗?

在推导完毕之后,会生成对应的函数实例,这叫做函数模板的实例化。它将根据模板描述中的模板参数类型,将函数模板中的代码替换为具体类型,并生成一个实际的函数定义。

C++初识模板,C++,原创,c++,开发语言

所以可以看出这些调动都是各种推导出的实际函数,并不是同一个函数。

自动推导,我们也叫隐式实例化

但如果我们模板只设置了一个类型参数,但我们传了2个类型不同的值,这时候就无法进行自动推导:

C++初识模板,C++,原创,c++,开发语言

这时候就可以用显式实例化

template<typename T>
T Max(T a, T b)
{
	return a > b ? a : b;
}
int main()
{
	//在函数名后的<>中指定模板参数的实际类型
	Max<int>(1.1, 3);
	Max<char>('a', 99);
	return 0;
}

🎶2.13 匹配原则

当编译器进行模板参数匹配时,它会优先考虑完全匹配的情况。如果有一个非模板函数,而且该函数模板还能被实例化成这个非模板函数的话,这时候编译器就不需要特化模板。

template<class T1, class T2>
T1 Add(T1 a, T2 b)
{
	std::cout << "T Add()" << std::endl;
	return a + b;
}
int Add(int a, int b)
{
	std::cout << "int Add()" << std::endl;
	return a + b;
}
int main()
{
	Add(1, 2);	//非模板函数完全匹配,不需特化
	Add<int>(1, 2);	//指定调用模板函数
	Add(1, 1.2);	//模板函数可以生成更加匹配的版本
	return 0;
}

Tips:

普通函数可以进行自动类型转换,模板函数不允许自动类型转换

📿2.2 类模板

类模板是一种用于生成通用类的模板。它允许在类定义中使用类型参数,以便可以创建适用于多种数据类型的类实例。类模板的语法如下:

template<typename T>
class ClassName
{
    // 类成员和方法
};

在数据结构中,可能会存储不同类型的数据,有了类模板,就十分方便了:

template<class T>
class Stack
{
public:
	Stack()
	{
		//...
	}
	//...
	void push_back(const T& val)
	{
		//...
	}
    //...
private:
	T _arr;
	int _size;
	int _capacity;
};
int main()
{
	Stack<int> st_i;	//整型
	st_i.push_back(1);
	st_i.push_back(2);

	Stack<double> st_d;	//浮点型
	st_d.push_back(1.1);
	st_d.push_back(1.2);
}

Tips:

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板后面跟上<T>,而且和普通类不一样的实例化也不一样

template<class T>
class A
{};

class B
{};

int main()
{
	A<int> a;	//A是类名	A<int>是类型
	B b;	//B既是类名也是类型
	return 0;
}

本期分享就到这里咯,如果有帮助的话点赞支持支持,我们下期再见,如果还有下期的话。文章来源地址https://www.toymoban.com/news/detail-541581.html

到了这里,关于C++初识模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】七、内存管理 (C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表

    2024年02月04日
    浏览(43)
  • learn C++ NO.8——初识模板(函数模板、类模板)

    现在是北京时间2023年6月5号13.31分,距离上一篇博客发布已过一周。期间还零零散散进行了一些期末考试,这也说明了我的大一时光快要结束了。我也想抓着期末的尾巴,好好的复习一下前面的所学内容,争取这周能够更一下简单数据结构的博客。 泛型编程是一种编程范式,

    2024年02月07日
    浏览(48)
  • 【C++初阶】内存管理 && 初识模板

    C/C++的内存分布主要分为 栈区、堆区、数据段和代码段,还有内存映射段。 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。

    2024年02月04日
    浏览(45)
  • HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门

    Mozilla创造了JS,Microsoft创建了TS,而Huawei进一步推出了ArkTS。因此在学习使用ArkTS前,需要掌握基本的TS开发技能。 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁、更自然的

    2024年02月06日
    浏览(51)
  • [C++开发 03 _ 模板(167)]

    1.1模板的概念  模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是万能的 1.2函数模板 1.2.1函数模板语法 函数模板的引入: 函数模板的举例:  总结: 函数模板利用template 使用函数模板有两种方式:1、自动类型推导     2、显示指定类型 模板的

    2024年01月20日
    浏览(38)
  • HarmonyOS(二)—— 初识ArkTS开发语言(中)之ArkTS的由来和演进

    在上一篇文章HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门,我初识了TypeScript相关知识点,也知道ArkTS是华为基于TypeScript发展演化而来。 从最初的基础的逻辑交互能力,到具备类型系统的高效工程开发能力,再到融合声明式UI、多维状态管理等丰富的应用开发能

    2024年02月06日
    浏览(57)
  • HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

    通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使

    2024年02月04日
    浏览(52)
  • 玄子Share-自然语言编程(NLP)_Java开发小白向 ChatGPT 提问的最佳模板

    以下内容均为 ChatGPT 回答 玄子: 我向你提问时,问题描述精确的重要性 ChatGPT 3.5 问题描述的精确性非常重要,因为它可以让回答者更好地理解您的问题,并且更容易提供准确和有用的解决方案。如果问题描述不够清晰或不够详细,回答者可能会误解您的问题或者理解不到位

    2023年04月09日
    浏览(47)
  • Unity Shader 学习(一):初识ShaderLab -- 以“Unlit Shader”模板为例 01

    阅读本文前需要对 渲染流程 有简单了解,并且要知道 Unity ShaderLab、Cg/HLSL 大概是什么,它们并不是一回事。 然后, 看什么教程都不如直接看官方文档: ShaderLab - Unity手册 HLSL参考 首先创建一个 Unlit Shader 模板(Project 窗口,右键 → Create → Shader → Unlit Shader) 直接上代码:

    2024年02月03日
    浏览(39)
  • Unity Shader 学习(二):初识ShaderLab -- 以“Unlit Shader”模板为例 02

    上一篇:Unity Shader 学习(一):初识ShaderLab – 以“Unlit Shader”模板为例 01 在Unlit Shader模板中引用了 UnityCG.cginc 中的很多宏和函数方法,这篇继续学习模板中的几个函数以及 UnityCG.cginc 中一些可能会用到的结构;最后再了解一些自己写Shader时大概率会用到的Cg/HLSL函数方法。

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包