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

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

模板分为函数模板和类模板两种,都可以通过参数形成特定的代码 函数模板的编写方法是在函数前用template附注模板参数列表,然后这里声明的类型T可以被使用到函数是参数和定义中...,一个实例化的类型总是包含模板参数的 与之前说过的一样,在模板类外定义成员函数时需要先指明模板实参列表的标签,然后说明成员所在的类且包含模板实参,然后用作用域运算符指出目标成员 与函数模板有些相通,类模板的成员函数只有在使用时才会实例化...我们通常使用标准库头文件type_traits中的类来进行特殊的类型转换,这些类常常被用作"模板元编程",下表简单地介绍了它们,使用的方法和普通的模板一样,用途也都在名字里了,例如remove_reference...通常情况下我们不能将左值传递给右值引用参数,但是C++设置了两个重要的例外来允许这种传递: 左值如i传递给模板类型的右值引用时,编译器会推断参数类型为左值引用i& 如果我们通过类型别名或模板参数之类的方法间接定义了引用的引用...常用的用法是打开std空间特例化标准库函数 我们甚至可以只特例化类中的某个成员函数而不是整个模板,写法其实就是将模板类中的某个函数在外部定义,然后这个定义以特例化模板函数的方法写出即可

1.5K30

【Example】C++ 回调函数及 std::function 与 std::bind

举个最经典的例子就是 std::sort,当你需要给一个存储有自定义结构体的 vector 进行排序时,编译器是无法知道如何对自定义结构体进行排序的。...二、std::function 与 std::bind 上面演示了最简单的回调函数创建及使用,然而,上面的代码却出现了一个局限性,就是: 如果需要去回调一个类成员函数,函数指针则无法指向类成员函数。....)> func; 【常规情况】std::function func; 可以看到,这个模板类当中对类型的声明方式是 类型 ( 参数类型1, 参数类型2, ......std::bind 它是一个基于模板的函数,顾明思意它的作用是绑定并返回一个 std::function 对象。 那么什么是“绑定”?...当用作类成员函数的绑定时,第一个参数仍然是作为类成员的可调用对象引用,第二个参数则是对象的指针,而第三个参数开始对应可调用对象的参数表。

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

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

    ,相等,关系,位运算 一般不是成员 混合类型表达式,注意一定要是非成员 输入运算符必须处理可能失败的情况,生成符合规范的元素输入或其他方法,要尽可能保持流的正常工作且负责让流从错误中恢复 如果定义了==...标准库的functional针对这个问题定义了function类,function类接受一个可调用对象为模板,然后可以按需求返回其返回类型,参数类型等等信息,并且可以按照相同的方式调用这些不同类型的可调用对象...,但是注意绑定到非类型整型必须是常量表达式,绑定到指针或引用的对象必须有静态的生存期(都是为了可以在编译期完成所要求的) 模板的提供者必须保证模板实例化时依赖于模板参数的名字都必须有定义,其他的要保证对编译器可见...类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元...16.2中有详细介绍 如果我们通过类型别名或模板参数之类的方法间接定义了引用的引用(正常情况下无法定义),会产生引用的“折叠”,(X&)&,(X&)&&,(X&&)&都折叠为X&,(X&&)&&折叠为X

    1.7K10

    C#4.0新增功能03 泛型中的协变和逆变

    由于 lambda 表达式与其自身所分配到的委托相匹配,因此它会定义一个方法,此方法采用一个类型 Base 的参数且没有返回值。...由于这些接口的所有类型参数都是协变类型参数,因此这些类型参数只用于成员的返回类型。 下面的示例阐释了协变类型参数。...由于这些接口只具有逆变类型参数,因此这些类型参数只用作接口成员中的参数类型。 下面的示例阐释了逆变类型参数。...此外,通过委托绑定中的变化,可以将方法绑定到具有限制较多的参数类型和限制较少的返回类型的任何委托,而对于泛型委托的指派,只有在委托类型是基于同一个泛型类型定义构造的时才可以进行。...下面的示例演示委托绑定中的变化和泛型类型参数中的变化的组合效果。 该示例定义了一个类型层次结构,其中包含三个按派生程度从低到高排列的类型,即Type1的派生程度最低,Type3的派生程度最高。

    1.3K20

    学习记录——抽象类和密封类

    如果将类看做是模板,那么抽象类就是一个不完整的模板,我们不能使用不完整的模板去构造对象。 抽象类和类成员 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。...抽象类的用途是提供一个可供多个派生类共享的通用基类定义。 例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。...抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。...由于密封类从不用作基类,所以有些运行时优化可以略微提高密封类成员的调用速度。 在对基类的虚成员进行重写的派生类上,方法、索引器、属性或事件可以将该成员声明为密封成员。...在用于以后的派生类时,这将取消成员的虚效果。 方法是在类成员声明中将 sealed 关键字置于 override 关键字前面。

    37531

    《Effective C++》学习笔记

    解决方案是将该乘法运算函数作为一个非成员函数,传两个参数进去,这样不管你的int放在前面还是后面,都能作为参数被转换类型了。...条款37:绝不重新定义继承而来的缺省参数值 不要重新定义一个继承而来的函数(虚函数)的缺省参数的值(参数默认值),因为函数是动态绑定(调用指针指向的对象的函数实现),但参数默认值却是静态绑定(指针声明时的类型所设定的默认参数...往往可消除,做法是将该参数改为函数参数或者类成员变量,而不要放到模板的参数中。...条款46:需要类型转换时请为模板定义非成员函数 模板类中的模板函数不支持隐式类型转换,如果你在调用时传了一个其他类型的变量,编译器无法帮你做类型转换,从而报错。...解决方案是将该模板函数定义为模板类内的友元模板函数,从而支持了参数的隐式转换。

    1.1K20

    Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十四

    在幕后,Apache Geode API 提供了实现和注册 Apache Geode 函数的类,这些函数部署在 Apache Geode 服务器上,然后可以由其他对等成员应用程序或从缓存客户端远程调用。...调用函数的缓存客户端应用程序不依赖于实现。为了调用一个函数,应用程序实例化一个 Execution 提供函数 ID、调用参数和函数目标,它定义了它的范围:区域、服务器、服务器、成员或成员。...通过使用 Spring,您可以编写一个简单的 POJO 并使用 Spring 容器将一个或多个 POJO 的公共方法绑定到一个函数。打算用作函数的 POJO 方法的签名通常必须符合客户端的执行参数。...因此,Apache Geode 的 Spring Data 包括增强的 Function 支持,以自动将 PDX 类型的方法参数转换为由 Function 方法的签名(参数类型)定义的所需应用程序域对象类型...有关自定义的、组合的特定于应用程序的 Apache GeodePdxSerializers以及基于方法签名的适当 POJO 函数参数类型处理的一个很好的示例。

    49120

    【C++】模板继承多态

    函数模板 意义:对类型进行参数化 模板的实参推演:可以根据用户传入的实参类型,来推导出模板类型。 函数模板 不会参与编译,在函数调用点,实例化/推导出类型,模板函数再进行编译。...模板代码是不能在一个文件中定义,在另一个文件中使用 模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能进行正常的实例化,产生能够被编译器编译的代码。...模板一般都是放在头文件中的,在源文件中展开 函数模板的非类型参数 必须是整数类型(整数/地址/引用)都是常量,只能使用 继承 继承的本质和原理 继承·的·本质·: a.代码复用 b.在基类中给所有派生类提供统一的虚函数接口...虚函数,静态绑定/动态绑定 总结一: 如果类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI指针(运行时的类型信息)和虚函数的地址...二: 一个类里面定义了虚函数,那么这个类定义的对象,其运行时,内存中开始的部分,多存储一个vfptr虚函数指针,指向相应类型的虚函数表vfptable。

    10510

    C屁屁(c++)万字入门

    对象的初始化、抽象类、静 态成员以及const成员函数 C++3.0 进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处 理 C++98 C++标准第一个版本,绝大多数编译器都支持,...;以前的定义是“函数” 1.1 命名空间定义 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。...{ return left * right; } } 注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 1.2命名空间使用 命名空间中成员该如何使用呢...或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题 个人理解:在c++开发者大佬,使用命名空间来解决变量名的冲突后,函数重载则是用来解决函数名冲突的另一个方法,类比于命名空间的分类管理...在C语言中,当生成这个链接后会生成函数名与之绑定,函数的调用时,编辑器就会将函数名于符号表的函数名匹配,然后通过其包存的地址,去调用函数。

    58710

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

    比如我们编写一个compare版本处理字符串字面常量(const char的数组),由于不能拷贝数组,因此我们将自己的参数定义为数组的引用,由于我们希望能够比较不同长度的字符串字面常量,因此为模板定义了两个非类型的参数...3.2 使用类的类型成员 我们用作用域运算符::来访问static成员和类型成员,在普通(非模板)代码中,编译器掌握类的定义,因此它直到通过作用域运算符访问的名字是类型还是static成员。...成员模板 一个类可以包含本身是模板的成员函数,这种成员被称为成员模板,成员模板不能是虚函数。 4.1 普通(非模板)类的成员模板 我们定义一个类,类似于unique_ptr所使用的默认删除器类型。...但是C++在正常绑定规则外定义了两个例外规则,允许这种绑定: 第一个例外规则:当我们将一个左值(如i)传递给函数的右值引用参数,且此右值引用指向模板类型参数(如T&&)时,编译器推断模板类型参数为实参的左值引用类型...对于一个给定类型X: X& &、X& &&和X&& &都折叠成X& X&& &&折叠成X&& 这两个规则导致了两个重要结果: 如果一个函数参数是一个指向模板类型参数的右值引用(即如T&&),则它可以被绑定到一个左值

    1.9K10

    C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

    当万能引用绑定到一个右值时,它被推导为右值引用;当绑定到一个左值时,它被推导为左值引用。这样,万能引用可以根据传入的参数的值类别来保持其原有的值类型。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝(浅拷贝 ),自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。...我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。...这是因为 emplace_back() 或者 emplace 系列函数是通过完美转发参数给构造函数来在容器中构造对象的 6. lambda表达式 6.1引入 之前我们想要对自定义类型进行排序的话,要自己给出比较方法的仿函数

    15600

    【C++】C++11(lambda、可变参数模板、包装器、线程库)

    默认生成的移动构造函数,对于内置类 型成员会执行逐成员按字节拷贝(值拷贝),自定义类型成员,则需要看这个成员是否实现移动构造, 如果实现了就调用移动构造,没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内 置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋 值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。...模板参数说明: Ret: 被调用函数的返回类型 Args…:被调用函数的形参 function的构造 function还重载了operator() 使用方法 #include成员函数的函数指针: 上面这种方法需要定义有名对象,很麻烦。下面是另一种方式: 这种方法可以用匿名对象。实际上,调用非静态的成员函数不是直接把参数传给过去。...如果有一个方法对应的函数参数个数不是两个,这时就可以使用bind。 下面介绍下模板中Ret的作用: Ret指的是可调用对象返回值的类型。

    12610

    AngularDart4.0 指南- 模板语法一 顶

    如果引用这些名称空间的名称,则模板变量名称优先,后面是指令的上下文,最后是组件的成员名称。 前面的例子显示了这样一个名字冲突。 该组件具有hero属性,而* ngFor定义了英雄模板变量。...您只需声明绑定源和目标HTML元素之间的绑定,然后让框架完成工作。 Angular提供了多种数据绑定。 本指南涵盖了大部分的Angular数据绑定及其语法的高级使用。...然后,您将学习如何使用封装了HTML的组件创建新元素,并将它们放入模板中,就好像它们是原生HTML元素一样。 然后你学习数据绑定。 你遇到的第一个绑定可能是这样的: 您现在已经准备好详细查看绑定类型。 属性绑定([property]) 编写一个模板属性绑定来设置一个视图元素的属性。 该绑定将该属性设置为模板表达式的值。

    5.2K10

    三十分钟入门基础Go

    1.1.4 方法、包 Go中方法的定义 使用func关键字来定义一个方法,后面跟方法名,然后是参数,返回值(如果有的话,没有返回值则不写)。...包与可见性 在 Go 语言中,无论是变量、函数还是类属性和成员方法,它们的可见性都是以包为维度的,而不是类似传统面向编程那样,类属性和成员方法的可见性封装在所属的类中,然后通过 private、protected.../定义了一个学生类,属性有id name等,每个属性的类型都在其后面 //定义学生类的构造方法 func NewStudent(id uint, name string, male bool, score...正是因为这种不合理的设计,所以在编写 PHP 类库中的每个接口时都需要纠结以下两个问题(Java 也类似): 一个接口需要声明哪些接口方法? 如果多个类实现了相同的接口方法,应该如何设计接口?...当一个类的成员方法集合包含了某个接口声明的所有方法,换句话说,如果一个接口的方法集合是某个类成员方法集合的子集,就认为该类实现了这个接口。

    21620

    C++模板(关键字template,typename)介绍

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。...4、在类模板外部定义成员函数的方法为: template模板形参列表> 函数返回类型 类名模板形参名>::函数名(参数列表){函数体}, 比如有两个模板形参T1,T2的类A中含有一个void h()...全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。...2.6、 全局变量的地址或引用,全局对象的地址或引用const类型变量是常量表达式,可以用作非类型模板形参的实参。 2.7 、sizeof表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。

    1.2K20

    两万字总结《C++ Primer》要点

    decltype类型指示符:选择并返回操作符的数据类型。只得到类型,不实际计算表达式的值。 自定义数据结构 (1)类 数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。...} 在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。销毁类类型的成员需要执行成员自己的析构函数。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的显式参数数量比运算对象的数量少一个。...类模板的定义以关键词template开始,后面跟尖括号对,其内为一个用逗号分隔的一个或多个模板参数的列表,随后是类的定义。 函数模板:模板定义,可从它实例化出特定函数。...函数模板的定义以关键词template开始,后跟尖括号,其内以一个用逗号分隔的一个或多个模板参数的列表,随后是函数的定义。

    2.1K30

    两万字总结《C++ Primer》要点

    decltype类型指示符:选择并返回操作符的数据类型。只得到类型,不实际计算表达式的值。 自定义数据结构 (1)类 数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。...} 在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。销毁类类型的成员需要执行成员自己的析构函数。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的显式参数数量比运算对象的数量少一个。...类模板的定义以关键词template开始,后面跟尖括号对,其内为一个用逗号分隔的一个或多个模板参数的列表,随后是类的定义。 函数模板:模板定义,可从它实例化出特定函数。...函数模板的定义以关键词template开始,后跟尖括号,其内以一个用逗号分隔的一个或多个模板参数的列表,随后是函数的定义。

    1.8K20

    C++模板总结

    模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板: 函数模板 针对仅参数类型不同的函数; 类模板 针对仅数据成员和成员函数类型不同的类....T的成员变量 a 和 b,还声明了一个返回类型为 T 带两个参数类型为 T 的函数 hy。...在类模板外部定义成员函数的方法为: template模板形参列表> 函数返回类型 类名模板形参名>::函数名(参数列表){函数体} 比如有两个模板形参 T1,T2 的类 A 中含有一个 void h...全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。 6、全局变量的地址或引用,全局对象的地址或引用 const 类型变量是常量表达式,可以用作非类型模板形参的实参。...7、sizeof 表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。

    1.3K20

    C++模板大总结!

    模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板: 函数模板 针对仅参数类型不同的函数; 类模板 针对仅数据成员和成员函数类型不同的类....T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。...在类模板外部定义成员函数的方法为: template模板形参列表> 函数返回类型 类名模板形参名>::函数名(参数列表){函数体} 比如有两个模板形参T1,T2的类A中含有一个void h()函数...全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。 6、全局变量的地址或引用,全局对象的地址或引用const类型变量是常量表达式,可以用作非类型模板形参的实参。...7、sizeof表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。

    74520

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券