最后,再来看看控制台是什么样子?
4
0
123
0
0
array<T, N>::operator - index out of range
到此处还意犹未尽的话,推荐阅读《对C++ templates类模板的几点补充(Traits类模板特化)》这篇文章——主要讲述了模板的缺省参数和类模板特化的相关知识,当然还涉及一些STL迭代器的内容。
2018-12-22 北京 海淀
Reference: C++ Templates(中文版)
最近打算挑选几个STL容器做个简单实现,发现里面牵涉到不少模板知识。这里算提前学习一下C++模板的相关知识吧。这次主要学习了什么是函数模板(这个最简单),类模板以及非类型模板参数。下面挨个举例说明。文章目录1. 函数模板2. 类模板3. 非类型模板参数1. 函数模板函数模板是最简答的一个,下面就定义一个返回两个值中最大者的函数模板:namespace og {template&amp;amp;lt;...
什么是类模板?
一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。类模板中的成员函数全部都是模板函
C++学习笔记:模板参数本章节主要学习一下模板形参的基本知识。模板参数有三种类型:类型模板参数、模板的模板参数(以模板作为模板的参数)、非类型模板参数。类型模板参数类型模板参数是我们使用模板的主要目的。也就是普通的类型模板参数,模板参数(Template parameters)声明在函数名之前的尖括号内:template<typename T> // T是模板参数
我们可以定义一个或者多个类型模板参数:template <typename
把类型当做未知量来处理,写的函数或者类,不因为数据类型的改变,而要修改代码--->数据类型改变,依然适用于代码(代码功能依旧可以使用)
例子:求(int类型、string类型...)最大值
因为数据类型的不同,需要多个相同的函数--->函数体是一样的,但是类型不同导致的额外代码
int Max(int a,int b)
return a > b ? a : b;
声明模板的语法
引入模板这个东西,把类型当作未知量
//单个未知类型
假如我们需要设计X和Y两个列表,这两个列表具有相似的代码唯一的不同是数据类型,则在C++中实现有如下的选择:
共同的基类:在大多数场景并不适用,只是为了一个列表去提炼基类也没必要。
克隆代码:分别对X 和 Y 类型定义各自的列表,能够保证类型安全但是后期维护成本高。
空列表:定义一个没有类型的列表 (void(*))。缺点是类型不安全。
除此之外,我们还可以用Template来实现,Template 既能保证重用代码,还能保证类型安全。那我们就来看看Template是如何施展魔法的。
Templa.
template<typename T, typename... U> //这里的U可以是不同类型
void func(const T& first, const U& ... args)
cout << first << endl;
func(args...);//递归调用,最后一次args为空,调用特化func
无类型的模板参数:C++的template可以传入普通的参数,和平时使用普通的函数参数有点相似,但又有很大的不同。
这种形式的模板一般是用来初始化类的数组成员的大小例如下面有的代码:
template
class CTest
int m_data[size];
void main()
CTest obj;// 将obj对象的成员 数值m_data大小初始为1