[C++] 模板template

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

[C++] 模板template,C++,c++,开发语言

 

目录

1、函数模板

1.1 函数模板概念

1.2 函数模板格式

1.3 函数模板的原理

1.4 函数模板的实例化

1.4.1 隐式实例化

1.4.2 显式实例化

1.5 模板参数的匹配原则

2、类模板

2.1 类模板的定义格式

2.2 类模板的实例化


讲模板之前呢,我们先来谈谈泛型编程:

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

[C++] 模板template,C++,c++,开发语言

1、函数模板

1.1 函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

1.2 函数模板格式

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

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

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class) 。

1.3 函数模板的原理

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

[C++] 模板template,C++,c++,开发语言

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

1.4 函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

1.4.1 隐式实例化

隐式实例化是让编译器根据实参推演模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
    int a1 = 10, a2 = 20;
    double d1 = 10.0, d2 = 20.0;
    Add(a1, a2);
    Add(d1, d2);
    
    return 0;
}

这里Add(a1, a2)与Add(d1, d2)都是隐式实例化,编译器会根据实参推出实际类型。

我们再来看一段代码:

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

int main()
{
	int i = 1;
	double d = 1.1;
	Add(i, d);

	return 0;
}

该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参i将T推演为int,通过实参d将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。

注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅Add(i, d);

[C++] 模板template,C++,c++,开发语言

这里要解决这样的问题有两种方式:

1. 用户自己来强制转化;

2. 使用显式实例化。

int main()
{
	int i = 1;
	double d = 1.1;
	Add(i, (int)d);

	return 0;
}

1.4.2 显式实例化

显式实例化是在函数名后的<>中指定模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int i = 1;
	double d = 1.1;
	Add<int>(i, d);// 显式实例化为int
	Add<double>(i, d);// 显示实例化为double

	return 0;
}

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

1.5 模板参数的匹配原则

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非模板函数匹配,编译器不需要特化
	Add<int>(1, 2); // 调用编译器特化的Add版本
}

2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化
	Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数 
}

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

2、类模板

2.1 类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
};
template<class T>
class stack
{
public:
	stack();//声明,在类外面定义

	~stack()
	{
		delete[] _a;
		_top = _capacity = 0;
	}
private:
	T* _a;
	int _top;
	int _capacity;
};

// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template<class T>
stack<T>::stack()
	: _a(nullptr)
	, _top(0)
	, _capacity(0)
{}

2.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

int main()
{
	stack<int> st1;
	stack<char> st2;

	return 0;
}

如果我们的栈是要存储int类型的数据,我们就实例化为int,如果是存储char类型的数据,就实例化为char类型。文章来源地址https://www.toymoban.com/news/detail-647741.html

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

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

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

相关文章

  • [C++] 模板template

      目录 1、函数模板 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.4.1 隐式实例化 1.4.2 显式实例化 1.5 模板参数的匹配原则 2、类模板 2.1 类模板的定义格式 2.2 类模板的实例化 讲模板之前呢,我们先来谈谈泛型编程: 泛型编程:编写与类型无关

    2024年02月13日
    浏览(67)
  • C++模板——template

    目录 1. 模板 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 声明定义分离 3. 类模板 3.1 类模板格式 3.2 类模板的实例化 3.3 类模板中函数放在类外进行定义时 4. 模板分离编译 4.1 什么是分离编译 4.2 模板的分离

    2024年01月20日
    浏览(39)
  • 模板匹配Template Matching

     实现代码: 运行结果:

    2024年02月11日
    浏览(41)
  • 【C++】模板template

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ C++       🛰️社区 :✈️ 进步学堂       🛰️欢迎关注:👍点赞🙌收藏✍️留言 模板是C++中泛型编程的基础,一个模板就是一个创建

    2024年02月12日
    浏览(92)
  • Django笔记(二):模板templates

    Django模板层是为动态生成html服务的,非本文重点。前后端分离的设计更为常见,尽量少的涉及Django模板层内容。本文记录Django如何找到一个html文件。 在创建一个Django项目project后,目录下会生成一个同名目录和manage.py。创建一个app,并为app编写一个视图,如: 当通过路由访

    2024年01月20日
    浏览(34)
  • 模板方法模式(Template Method)

    模板方法模式是一种行为设计模式,在超类中定义了一个算法的框架,而将一些步骤的实现延迟到子类中,使得子类可重定义该算法的特定步骤。 模板方法模式包含如下角色: Abstract ­Class,抽象类,实现一个模板方法,定义了算法的骨架。需要说明的是,算法中的步骤可以

    2024年02月14日
    浏览(96)
  • Django学习笔记-模板(Template)基础

    使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 Django的模板引擎在sttings.py文件中: Django模板引擎中使用“{% %}”来描述python语句,使用“{{ }}”来描述变量,常用语句示例说明如下: 标签 说明 {% extends \\\"模板名\\\" %} 扩展一个母模

    2024年02月15日
    浏览(37)
  • ElasticSearch第十六讲 ES 索引模板Index Template与Dynamic Template

    Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到 新创建的索引之上。模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引,你可以设定多个索引模版,这些设置会被“merge”在一起,你可以指定“order”的数值,控制“

    2024年02月15日
    浏览(36)
  • Gee教程6.模板(HTML Template)

    这一章节的内容是介绍 Web 框架如何支持 服务端渲染 的场景 实现静态资源服务(Static Resource)。 支持HTML模板渲染。 这一章节很多内容是基于net/http库的,该库已经实现了很多静态文件和HMML模板的相关功能的了。 网页的三剑客,JavaScript、CSS 和 HTML。要做到服务端渲染,第一步

    2024年02月04日
    浏览(48)
  • Avalonia的模板控件(Templated Controls)

    在Avalonia的UI框架中,TemplatedControl是一个核心组件,它提供了一种强大的方式来创建可重用且高度可定制的控件。 本文将深入探讨TemplatedControl的概念、其带来的优势以及它在实际开发中的应用场景,并通过一个示例代码来展示其用法。 什么是TemplatedControl TemplatedControl是Aval

    2024年04月08日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包