首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】模板进阶

---- ---- 一、非类型模板参数(用整型类型变量来作为模板的参数,传参时只能传常量) 1.非类型模板参数的规定 1....在C语言阶段如果想要让数组的大小可以自己控制,一般都会用定义宏的方式来解决,在C++中我们可以使用非类型模板参数来进行解决,下面代码给出类模板的声明,在使用时我们可以显示实例化类模板,给非类型模板参数传一个常量...非类型模板参数声明时的类型必须只能是整型,其他例如自定义类型,字符串类型,浮点型等类型均不能作为非类型模板参数的类型声明,只有整型才可以。 4....在main函数的测试用例中前两次的打印结果都是正常的,因为日期之间进行比较时可以直接调用日期类的运算符重载,并且Less是一个函数模板,可以接收所有的类型的比较,包括内置类型和自定义类型。 2....第二种就是在模板定义的位置也就是.cpp文件里面进行对应模板参数类型的显式实例化,但这种方式不推荐,如果我要实例化出10个类呢?那你就在类模板定义的地方连续显示实例化出10个类吗?

1.1K20

模板

泛型 c++中引进了泛型的概念,而引用泛型也是为了解决了C语言中对不同类型的参数需要实现多个不同参数的麻烦。 而泛型只是提供一个模板而已,对于不同的函数或者类会自动实例化相应的函数或者类。...对于c语言的函数,我们需要写不同类型的参数。即使c++中引入了函数重载,也是需要写多个重载函数。而模板的出现解决了这个问题。...虽然我已经遇到过了。 类模板 为什么引用模板上文已经说了,这里就不再叙述。 本博主觉得和函数模板差别不是很大,只不过要显示的写出类型。类型随意,可以是自定义类型也可以为内置类型。...非类型的模板参数就是:这个模板的形参是一个常量。...为什么要引入模板特化? 先回答第一个问题,什么是模板特化——在原先已有模板的情况下,将参数T写成具体的类型。

45310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【笔记】《C++Primer》—— 第16章:模板与泛型编程

    在第二部分中介绍一些标准库容器时我们称其为泛型容器,因为它们可以利用了模板类的特性能对各种符合要求的类型进行处理,可以独立于任何类型运行 模板是泛型编程的基础,一个模板就是创建类或函数的蓝图或者公式,当我们在编译时提供了足够的参数后模板就会转换为特定的类或函数...当我们调用函数模板时,编译器和以前一样可以自动按照我们的实参来推断模板参数的类型,如果想要指定类型则和使用泛型容器时一样在函数名后用尖括号标明所需要的具体类型T即可。...,非类型参数表示的是一个值而不是类型,因此非类型参数在编译时会被用户提供或编译器推断的一个常量代替,从而允许我们初始化数组之类 非类型参数可以是整型或指向对象或函数的指针或左值引用,但是注意绑定到非类型整型必须是常量表达式...T&时,代表我们只能传递给他一个左值,此时如果传的是T则得到类型T,如果传的是const T则得到const T 当函数的参数是const引用时,我们直到我们可以传递给他任何实参,此时const...然后再用得到的信息正确的参数传递给其他函数,这就是转发操作 16.3 重载与模板 函数模板可以被另一个模板或非模板函数重载,与平时一样名字相同的函数需要参数不同才能重载 但是对于函数模板来说,实参调用的函数会是重载版本中的哪一个需要按照以下规则来判断

    1.5K30

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    当我们需要显式调用递增递减运算符时,我们需要对后置版本的参数传递一个任意int值,这样编译器才能区分出版本 重载函数调用运算符让我们可以像使用函数一样使用类的对象,称为函数对象,函数对象常常用作泛型算法的实参...,指重新实现了一个名称和参数都一样的方法 重载 overload,指对一个同名方法进行了几种不同参数的实现 可以将一个派生类对象转换为基类对象,此时派生类独有的部分将被截断,其基类部分被处理而派生类部分被忽略...OOP让我们可以在运行时处理运行前未知的动态情况,而泛型模板编程让我们可以在编译时就处理好一些动态的情况 当我们调用函数模板时,编译器和以前一样可以自动按照我们的实参来推断模板参数的类型 可以由具体关键字带头声明非类型参数...,非类型参数表示的是一个值而不是类型,因此非类型参数在编译时会被用户提供或编译器推断的一个常量代替,从而允许我们初始化数组之类 非类型参数可以是整型或指向对象或函数的指针或左值引用,但是注意绑定到非类型整型必须是常量表达式...&&,也就是删去两个引用符 左值如i传递给模板类型的右值引用时,编译器会推断参数类型为左值引用i& 直接利用右值引用参数会丧失右值引用属性,这时我们可以通过让右值引用后进入函数的参数调用utility文件中的

    1.7K10

    C++模板初阶

    文章目录 泛型编程 函数模板 1.函数模板的使用 2.不同类型的传参处理 1.强制类型转换 2.显示实例化 3.多参数模板 3.模板可以和实例函数同时存在,编译器优先调用实例函数 类模板 1.类模板需要显示实例化...2.类模板不能声明定义分离 非类型模板参数 泛型编程 在一个项目中,我们可能需要交换不同类型的数据。...2.不同类型的传参处理 1.强制类型转换 既然函数模板是编译器根据我所传的参数自动推演而来,那么一个函数模板是否可以处理两个不同类型的参数呢?...所以只要对参数加上const就可以使这段代码成功跑过: 2.显示实例化 除了强制类型转换以外,还可以在传参时对模板的参数显示实例化明确的告诉编译器应当产生什么类型的函数,这个时候如果传参是两个不同类型...Add函数使用两个模板参数时对于不同类型参数的传参不用我做任何处理,编译器有足够的泛型参数对两个不同的类型进行推演,不过返回值还是只能是两个类型中的一个。

    62700

    【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

    具体来说,仿函数是一个类或结构体,它重载了operator()运算符,从而使得这 个类的对象可以像函数一样被调用。 2....,并通过重载operator()运算符来使这些类的对象具有类似函数的行为。...非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用 我们在之前学的所有模板用的基本上都是类型形参,也就是你传什么,他就用什么,而非类型形参则是相当于固定了一个模板参数的类型...return 0; } 注意: 浮点数、类对象以及字符串是不允许作为非类型模板参数的 非类型的模板参数必须在编译期就能确认结果 2....通过重载operator(),我们可以将函数行为封装在类中,从而可以像操作普通对象一样操作函数。

    17610

    模板的简单介绍与使用

    什么是模板? 模板(template)指c++中的函数模板与类模板,大体对应于C#和Java众的泛型的概念。目前,模板已经成为C++的泛型编程中不可缺少的一部分。...模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号括住的一个或者多个模板形参的列表,形参之间以逗号分隔。 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。...两者的区别可以参考这篇文章)。 模板是C++程序员绝佳的武器, 特别是结合了多重继承(multiple inheritance)与运算符重载(operator overloading)之后。...只需要定义一个带有泛型参数的函数,就可以实现多种类型参数的比较,直接看下面的代码吧: 1 class MyTemplate 2 { 3 public: 4 MyTemplate(void...当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数。

    1.3K80

    【C++】模板进阶

    之前我们已经了解了模板的定义和使用,今天我们来学习模板更加深层次的知识内容,辅助我们像后面更好的学习! ---- ---- 1.非类型模板参数 模板参数分为:类型形参与非类型形参 。...这类模板参数叫做:类型参数 vector v;   list ls; 那么如果有一个场景,我们要定义一个静态数组,能够传不同的模板参数,进而每次得到不同大小的数组应该怎么办呢...,不需要浪费空间,只需要再加一个非类型模板参数,就可以通过改变传的模板参数,而实例化出不同的对象。...,结果错误 return 0; } 实现一个比较的函数模板,对于内置类型的比较,结果正确; 自定义类型(日期类)的比较,其内部有实现运算符重载,结果也正确 但是对于p1,p2相比较,结果却不对...2.2类模板特化 函数模板特化可以函数重载替代,但是类模板可不能重新再写一个。 2.2.1 全特化 全特化即是将模板参数列表中 所有的参数都确定化。

    46820

    C++【模板进阶】

    ---- 前言 模板是搭建 STL 的基本工具,同时也是泛型编程思想的代表,模板用好了可以提高程序的灵活性,以便进行更高效的迭代开发,模板除了最基本的类型替换功能外,还有更多高阶操作:非类型模板参数、全特化...,如 size_t,此时称为 非类型模板参数 注:非类型模板参数必须为常量,即在编译阶段确定值 利用 非类型模板参数 定义一个大小可以自由调整的 整型数组 类 template class...,支持了许多 STL 容器的功能,比如 迭代器 和 运算符重载 等实用功能,最主要的改进是 严格检查越界行为 实际开发中,很少使用 array,因为它对标传统数组,连初始化都没有,vector 在功能和实用性上可以全面碾压...全特化模板中的模板参数可以不用写 需要在类名之后,指明具体的参数类型,否则无法实例化出对象 2.3.2、偏特化 偏特化,指 将泛型范围进一步限制,可以限制为某种类型的指针,也可以限制为具体类型 //原模板...和 特殊情况 之间做了折中处理,使得 限制范围式的偏特化 也可以实现 泛型 比如偏特化为 T*,那么传 int*、char*、Date* 都是可行的 借助偏特化解决指针无法正常比较问题(也是可以偏特化为引用类型的

    17610

    第 16 章 模板与泛型编程

    第 16 章 模板与泛型编程 标签: C++Primer 学习记录 模板 泛型编程 ---- 第 16 章 模板与泛型编程 16.1 定义模板 16.2 模板实参推断 16.3 重载与模板 16.4...因为编译器需要在编译时实例化模板,此时非类型参数会被一个用户提供的或编译器推断出的值所代替,所以这些值必须是常量表达式。 非类型参数可以是一个整型,对应的模板实参必须是常量表达式。...而在模板定义内,可以将这个非类型参数用在任何需要常量表达式的地方,如指定数组大小。...const转换,可以将一个非 const对象的引用(或指针)传递给一个 const的引用(或指针)形参。...解决这种问题的办法是,使用基于函数参数的模板重载,来将实参分别为右值或左值时的情况分离开来。

    1.4K60

    第 16 章 模板与泛型编程

    因为编译器需要在编译时实例化模板,此时非类型参数会被一个用户提供的或编译器推断出的值所代替,所以这些值必须是常量表达式。 非类型参数可以是一个整型,对应的模板实参必须是常量表达式。...而在模板定义内,可以将这个非类型参数用在任何需要常量表达式的地方,如指定数组大小。...const转换,可以将一个非 const对象的引用(或指针)传递给一个 const的引用(或指针)形参。...解决这种问题的办法是,使用基于函数参数的模板重载,来将实参分别为右值或左值时的情况分离开来。...// 该模板将两个额外参数逆序传递给指定的可调用对象 template void flip1(F f, T1 t1,

    1.5K20

    【泛型编程】模板全详解

    泛型编程 1.引入 在c语言中,如果我们想写多类型的,并且是同一个函数出来的函数,我们只能要几个写几个出来,这样子会显得比较冗余,也加大了程序员的代码量,于是c++中就引入了函数重载和泛型编程的概念,大大的简化了我们的工作...② 代码的可维护性比较低,一个出错可能导致所有重载均出错。 2.什么是泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。...如果模板可以产生一个具有更好匹配的函数,那么将选择模板。...类型模板参数定义的是虚拟类型,注重的是你要传什么,而 非类型模板参数定义的是常量。...3.STL中的Array(不重要) 官方文档:array - C++ Reference 现在学了非类型模板参数了,我们现在再来回头看 array: array 是 C++11 新增的,它有什么独特的地方吗

    67920

    【C++】泛型编程:吃透模板

    如果模板可以产生一个具有更好匹配的函数,那么将选择模板。...= nullptr; _capacity = _top = 0; } 知识点小结 模板可以具有 非类型参数,用于指定大小,可以根据指定的大小创建动态结构(这个下面会讲到)。...类型模板参数定义的是虚拟类型,注重的是你要传什么,而 非类型模板参数定义的是常量。...非类型形参:就是用一个常量作为类 (函数) 模板的一个参数,在类 (函数) 模板中可将该参数当成常量来使用。 ​ 既然有了这个非类型模板参数,我们尝试着来解决问题!...三、STL 中的 Array(不重要) 官方文档:array - C++ Reference ​ 现在学了非类型模板参数了,我们现在再来回头看 array: ​ array 是 C++11 新增的,它有什么独特的地方吗

    10910

    CC++开发基础——函数模板

    一,函数模板 1.基础概念 模板编程是C++中泛型编程的基础。 一个模板可以是创建类或者函数的蓝图。 模板编程分两种,分别是算法抽象的模板、数据抽象的模板。...template void func(T1 a, T2 b) 7.非类型的模板参数 模板参数分两种: 1.类型模板参数 2.非类型模板参数...由尖括号""括起来的模板参数列表中,除了可以包含类型模板参数,还可以包含非类型模板参数。...函数模板定义了两个非类型模板参数,参数N表示第一个数组的长度,参数M表示第二个数组的长度。 数组采用const和引用的方式传参。...: 整型,如int、long等 枚举类型 对象类型的引用或指针 函数的引用或指针 类成员的指针 当模板参数列表中,同时有类型模板参数和非类型模板参数时,建议将非类型模板参数写在类型模板参数的前面。

    15521

    【Example】C++ Template (模板)概念讲解及编译避坑

    利用模板,您可以定义类或函数的操作,并允许用户指定这些操作应使用的具体类型。 总结:模板是 C++ 当中支持参数类型与返回值动态化的工具,使开发人员可以动态自定义函数、类中参数与返回值类型。...进行在模板函数调用时,编译器会根据变量类型推断函数参数类型。 那么,函数模板是否可以支持多种类型呢?可以!...可以! 但是,进行运算操作的时候,你要确保你的 struct 或 class 重载的相应的运算符!...成员函数可以是函数模板,并指定附加参数。 ...Spring Season Pass : 【Example】C++ 标准库常用容器全面概述 【Example】C++ 回调函数及 std::function 与 std::bind 【Example】C++ 运算符重载

    79320

    【c++】模板详解(2)

    一、非类型模板参数 之前我们在定义模板时,模板参数都是类型,而实际上模板参数可分为类型参数和非类型参数,非类形参数在模板实例化时需要被具体的值所替代。...通常情况下,非类型参数都是常量表达式。所以在模板当中,我们就可以将非类型参数当作一个常量来使用。...与类型参数相同,非类型参数可以在参数列表中指定默认值,也可以不指定。但是这个值必须在编译阶段就能确认其结果。...在c++20之前,非类型参数只能是整形、枚举类型或指针类型的值。c++20之后,才可以使用其他类型的值作为参数。 二、模板的特化 1....} 这种实现方式,对于内置类型和具有比较运算符重载的类类形而言,都可以达到预期效果。

    12410

    《C++Primer》第十六章 模板与泛型编程

    第十六章 模板与泛型编程 定义模板 1....return tmp; } 1.1 非类型模板参数 除了定义类型参数,还可以定义非类型参数nontype parameter,一个非类型参数表示一个值而非一个类型。...,或者是一个指向对象或者函数类型的指针或(左值)引用 绑定到非类型参数的实参必须是一个常量表达式 绑定到指针或者引用非类型参数的实参必须具有静态的生存期 1.2 编写类型无关的代码 编写泛型代码的两个重要原则...我们的类将包含一个重载的函数调用运算符,它接受一个指针并对此指针执行delete,由于我们希望删除器适用于任何类型,因此我们将调用运算符定义为一个模板。 // 函数对象类....类型转换与模板类型参数 能在调用中应用于函数模板的包括如下三项: 顶层const无论是在形参中还是在实参中都会被忽略 const转换:可以将一个非const对象的引用(或指针)传递给一个const的引用

    1.9K10

    C++为什么有参数依赖查找(ADL)?

    重载解析:如果名称查找找到了多个具有相同名称的声明,编译器将根据上下文和参数类型来选择最合适的声明。...对于函数和函数模板名称,名称查找可以将多个声明与同一名称关联起来,并且可能从参数依赖查找中获得额外的声明(模板参数推导也可能适用),这一组声明集被传递给重载解析,来选择最终要使用的声明。...Argument-dependent lookup (ADL) 是一组规则,用于在函数调用表达式中查找未限定的函数名称,包括对重载运算符的隐式函数调用。...支持泛型编程:在模板编程中,ADL使得模板能够使用与模板参数类型相关的特定操作,而无需程序员显式地指定这些操作的命名空间。这使得模板更加通用和灵活。...参考引用 关于"在C++中确定一个名称"这一相关话题,本文仍有一些未提及的场景,比如模板参数推导、重载解析等,可以参考:

    12110

    C++ 模板学习

    模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。...4.非类型模版参数 一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。 那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。...底线是:自动模板参数推导包含类型转换,并且在编译器自动决定模板参数时某些类型属性将丢失。这些类型属性可以在使用显式函数模板参数申明时得以保留。 6....答案1:重载了 () 操作符的对象,因此,这里需要明确两点:   1 仿函数不是函数,它是个类;   2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用比如:   struct...仿函数的用处 不管是对象还是函数指针等等,它们都是可以被作为参数传递,或者被作为变量保存的。因此我们就可以把一个仿函数传递给一个函数,由这个函数根据需要来调用这个仿函数(有点类似回调)。

    970100

    C++:模版进阶 | Priority_queue的模拟实现

    一、非类型模版参数 模板参数分类为类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。...非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。 注意: 非类型的模板参数必须在编译期就能确认结果。...我们不传的时候N就是缺省值,传的时候就是我们指定的容量。 2、我直接用静态数组不行吗?为什么非得用类把他封起来??...,同时还可以利用这个类去增加许多新的接口 3.能够作为非类型模版参数的有哪些类型??...2.2.1 全特化 全特化即是将模板参数列表中所有的参数都确定化 2.2.2 部分特化 部分特化的意思就是说,我们把其中一部分参数进行特化了。

    12910
    领券