
C++ 模板
文章平均质量分 73
一起学习《C++ Templates》
YAFree123
这个作者很懒,什么都没留下…
展开
-
第23章 元编程
元编程本质上是在编写程序的过程中创造新的程序,或者说,它涉及编写一段代码,这段代码将在编译阶段被执行,以生成实现真正所需功能的新代码。这里的“反射属性”意味着元编程部件(metaprogramming component)是它为之生成代码的那个程序的一部分,也就是说,元编程创建或修改了原程序本身的某个部分。元编程之所以被推崇,原因与大多数其他编程技术相同,旨在以较少的努力获得更多的功能,其中努力的程度可以用代码量、维护成本等多种指标衡量。原创 2024-03-29 10:18:47 · 321 阅读 · 0 评论 -
第22章 桥接静态和动态多态性
静态多态(模板)在运行时表现出与非多态代码相同的性能水平,因为它在编译时就已经确定了可以使用的类型集合。这意味着使用模板时,编译器会针对具体的类型参数生成相应的函数或类实例,这样执行效率高,但缺点在于在运行时无法支持未预见到的新类型。换言之,若要在运行时改变处理的类型,则必须重新编译代码。相反,动态多态(通过继承和虚函数)允许单一版本的多态函数能够与编译时未知的具体类型一起工作,这是因为在运行时通过指向基类的指针或引用调用虚函数,可以根据实际对象类型调用对应的派生类实现。原创 2024-03-28 14:34:59 · 917 阅读 · 0 评论 -
第21章 模板和继承
如果编译器会实现了EBCO,会发现继承基类的派生类和基类具有同样的大小,且继承优化后的空派生类,大小依旧不变。空基类优化(EBCO,Empty Base Class Optimization)是模板库中的一项重要优化手段。空基类优化是指当一个类作为基类且其内部没有任何非静态数据成员或其他需要运行时内存分配的内容时,编译器可以优化其布局,使得多个空基类不会重复占用存储空间。这样做的结果是可以节省内存,特别是当用户定义的类派生自多个这样的空基类时,每个空基类都可以在对象内存布局中占据零字节的位置。原创 2024-03-28 09:50:01 · 490 阅读 · 0 评论 -
第19章 Traits的实现(三)
实现一个traits,判断一个类型是否能够转换为另一个类型上面的实现还有一些不足,没有考虑到类似数组等类型的匹配问题,细节可以参考std::is_convertible<>的实现。原创 2024-03-27 19:43:32 · 310 阅读 · 1 评论 -
第19章 Traits的实现(二)
在传统的C/C++编程中,函数通常是值函数,它们接收值作为输入参数,并计算得出一个值作为输出结果。然而,C++模板允许我们定义一类特殊的函数,即类型函数,它们接收一个或多个类型作为参数,并根据这些类型生成一个新的类型或常量作为输出结果。模板可以定义与类型相关的行为,这意味着我们可以编写模板来根据不同类型的行为特性提取相关信息。例如,sizeof是一个内置的类型函数,它接受一个类型作为参数,并返回该类型的大小(以字节为单位)的常量值,这就是一个直观的类型函数示例。在C++中,sizeof。原创 2024-03-26 22:40:30 · 814 阅读 · 0 评论 -
第 19 章 Traits的实现(一)
在C++编程中,特征模板(Trait Templates)是一种设计模式,用来封装类型相关的属性或行为,以便在编译时获取类型信息或者控制模板行为。特征模板有助于简化代码、提高类型安全性以及在模板编程中实现元编程。原创 2024-03-25 21:04:28 · 1115 阅读 · 0 评论 -
第 18 章 模板的多态性
多态性也是面向对象泛型编程的基础,C++ 中通过类继承和虚函数来支持多态。因为这些机制 (至少部分) 在运行时处理,所以这里讨论动态多态性。通常所说的多态性,指的就是。然而,模板还允许将不同的特定行为与单个泛型表示关联起来,但这种关联通常在编译时进行处理, 称之为。原创 2024-03-25 16:21:28 · 624 阅读 · 0 评论 -
第11章 通用库
• 模板允许将函数、函数指针、函数对象、函子和 Lambda 作为可调用对象传递。• 使用重载 operator() 定义类时,将其声明为 const(除非调用改变了状态)。• 使用 std::invoke(),可以处理所有可调用对象的代码,包括成员函数。• 使用 decltype(auto) 来完美地转发返回值。• 类型特征是检查类型属性和功能性函数。• 当需要模板中对象的地址时,可以使用 std::addressof()。原创 2024-03-24 22:41:50 · 446 阅读 · 0 评论 -
第 10 章 基本模板的术语
声明是一种 C++ 构造,在 C++ 作用域中引入或重新引入一个名称。此介绍会包含该名称的部 分类别,但进行有效声明时不需要详细信息。class C;当声明的结构已知时,或对于变量,必须分配存储空间时,声明就变成了定义。对于类类型定 义,必须提供带括号的主体。对于函数定义,这就必须提供 (一般情况下) 用大括号括起来的函数体, 或者必须将函数指定为 =default 或 =delete。对于变量,初始化或缺少 extern 说明符会导致声明变成 定义。原创 2024-03-24 21:47:31 · 313 阅读 · 0 评论 -
第 9 章 实际使用模板
按照传统的C++开发习惯,非模板代码会将类和其他类型声明放在头文件中(.hpp或.h等),而全局变量和(非内联)函数的定义则放置在单独的实现文件(.cpp)中。这种方式确保了类型在整个项目中可见,并防止链接时出现重复定义的错误。然而,在模板的实际使用中,这种分离声明和定义的做法会导致问题。例如,有一个名为printTypeof的模板函数,它的声明位于头文件myfirst.hpp中,而实现却在单独的myfirst.cpp文件中。原创 2024-03-24 21:29:22 · 245 阅读 · 0 评论 -
第八章 编译时编程
• 模板提供了在编译时进行计算的能力 (使用递归进行迭代,使用偏特化或三元操作符进行选 择)。• 使用 constexpr 函数,可以将大多数编译时计算替换为,可在编译时上下文中调用的“普通函 数”。• 使用偏特化,可以根据特定的编译时约束,在类模板的不同实现之间进行选择。• 模板只在需要的时候使用,在函数模板声明中的替换不会导致代码无效。这个原则称为SFINAE(替换失败不为过)。• SFINAE只能用于为特定类型和/或约束提供函数模板。原创 2024-03-24 21:06:25 · 919 阅读 · 0 评论 -
第 7 章 使用值还是引用?
一般情况下,建议,除非有必须要用引用传递的理由。在C++17之前,如果一个类类型没有定义复制构造函数或移动构造函数,那么即使尝试以值传递的方式传递一个临时对象(右值),也会导致编译错误,因为编译器无法找到合适的方式来创建新对象。然而,在C++17中引入了“guaranteed copy elision”(保证拷贝消除)的概念,即使没有显式定义复制或移动构造函数,编译器在某些情况下也能安全地省略临时对象的创建和后续的复制或移动操作。原创 2024-03-24 11:33:19 · 628 阅读 · 0 评论 -
第六章 移动语义与enable_if<>
• 模板中,通过将参数声明为转发引用 (声明为模板参数名称后跟 && 形成的类型) 并在转发调 用中使用 std::forward<>(),就可以“完美”地转发参数了。• 使用完美转发成员函数模板时,可能会比预定义用于复制或移动对象的特殊成员函数更匹配。• 使用 std::enable_if<>,可以在编译时条件为 false 时禁用函数模板 (当条件确定,将忽略模板)。• 概念允许对函数模板需求使用更直观的语法。原创 2024-03-23 22:08:30 · 806 阅读 · 1 评论 -
第五章 基础技巧
typename 的引入是用来修饰模板类中的标识符是一个类型。没有typename修饰,编译器无法将Subtype 识别为一个类型(C++20 貌似不需要typename进行修饰了?!原创 2024-03-23 13:36:34 · 282 阅读 · 1 评论 -
第四章 可变参数模板
• 通过使用参数包,可以为任意数量、类型的模板参数定义模板。• 要处理参数,需要递归和/或匹配的非变参函数。• 操作符 sizeof… 可为参数包提供的参数数量。• 可变参数模板的一个应用是转发任意数量的类型参数。• 通过使用折叠表达式,可以对参数包中的所有参数使用相应的操作符。原创 2024-03-22 19:53:51 · 493 阅读 · 1 评论 -
第 3 章 非类型模板参数
• 模板的模板参数可以是值,而非类型。• 不能将浮点数或类类型对象作为非类型模板的参数。对于指向字符串字面量、临时对象和子对象的指针/引用,有一些限制。• 使用 auto 可使模板具有泛型值的非类型模板参数。原创 2024-03-21 20:53:39 · 348 阅读 · 1 评论 -
第二章 类模板
• 类模板是在实现时保留一个或多个类型参数的类。• 要使用类模板,需要将类型作为模板参数传递。并为这些类型,实例化 (并编译) 类模板。• 对于类模板,只有调用的成员函数会实例化。• 可以为某些类型特化类模板。• 可以偏特化某些类型的类模板。• C++17后,可以从构造函数中自动推导出类模板的参数。• 可以定义聚合类模板。• 若声明为按值调用,则模板类型的调用参数会衰变。• 模板只能在全局/命名空间作用域或类声明内部声明和定义。原创 2024-03-21 14:23:44 · 320 阅读 · 1 评论 -
第一章:函数模板
比较简单,使用typename申明(与class关键字等价)intdouble在编译期,模板会根据使用到的类型参数,生成一个对应参数的函数实体进行编译,这一过程称为:实例化。模板的编译过程,会首先检查模板代码本身的语法,然后还会检查实例化的代码的有效性。原创 2024-03-20 23:08:23 · 270 阅读 · 1 评论