本章将深入探讨 C++ 模板如何通过泛型编程解决这些问题,并通过 Windows 注册表操作等实战案例,展示模板在真实场景中的强大能力。...{ /*...*/ }; std::vectorstd::unique_ptr> buttons; // 按钮容器 std::vectorstd::unique_ptr<TextBox...a : b; } 3.2 C++ 模板的优势 零成本抽象:生成的代码与手写版本效率相同 编译期多态:无运行时开销,支持运算符重载 图灵完备:可在编译期执行复杂计算(模板元编程) 四、如何实现一个 Windows...类型安全:编译器确保返回类型与预期一致 易扩展性:添加新类型只需新增特化版本,无需修改已有代码 五、模板的代价与注意事项 5.1 编译时间成本 模板代码在头文件中实现,可能导致编译时间增加。...可通过以下方式优化: 提取公共逻辑到非模板基类 使用 extern template 声明(C++11) // 在头文件中声明 extern template class std::vector<int
Blob{public:Blob();Blob(std::initializer_list i);}; 模板类的使用: 在定义类时,使用到类名的地方都需要显示的给出模板类的类型,格式为 int...::size_type //编译器知道我们要访问string类中的size_type数据类型 但是对于模板就不能使用这种方法了,例如: //编译器不知道size_type是一个static数据成员还是一种数据类型...所以如果我们希望使用一个模板类型参数的类型成员,就必须显式地告诉编译器改名字是一个类型。...p)const //成员模板{os unique_ptr" std::ostream &os;}; 下面是基本的使用格式:...); //构造函数接受一个迭代器区间,用来初始化dataprivate:std::vector data;}; 现在我们在类的外部定义构造函数,由于类模板与成员函数都是模板,因此在外部定义时需要分别同时给出这两个模板的模板参数列表
// x的类型为int auto y = 3.14; // y的类型为double auto ptr = new int(5); // ptr的类型为int* 与模板一起使用...此外,C++标准库还提供了其他智能指针,如 std::auto_ptr(在C++11已弃用)、std::scoped_ptr(C++11之前的实现)、std::unique_ptr的数组版本std::unique_ptr...可以按值捕获、按引用捕获,也可以使用&表示按引用捕获、=表示按值捕获。 parameter list:参数列表,与普通函数的参数列表类似。...-based for 循环一起使用。...: 当需要将资源从一个对象转移到另一个对象时,可以使用移动语义,避免昂贵的深拷贝。
但是到了C++当中,这种弊端就显而易见了,解决方式便是使用 std::function 与 std::bind 互相配合。...为什么要进行“包装”与“转发”呢? 首先,不规范的解释是,function 的作用是包装,它可以包装类成员函数,但却无法生成类成员函数的可调用对象。而 std::bind 则是可以生成。...,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向将访问其成员的对象。...+ 标准库智能指针 unique_ptr 与 shared_ptr 【Example】C++ 接口(抽象类)概念讲解及例子演示 【Example】C++ 虚基类与虚继承 (菱形继承问题) 【Example...】C++ Template (模板)概念讲解及编译避坑 【Example】C++ 标准库 std::thread 与 std::mutex 【Example】C++ 标准库多线程同步及数据共享 (std
智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL中的shared_ptr支持多个智能指针管理同一个对象。...如此做,指针指针,辅助类对象与被引用对象的关系如下图所示: image.png 辅助类将引用计数与智能指针类指向的对象封装在一起,引用计数记录有多少个智能指针指向同一对象。...这个辅助类含有两个数据成员:计数count与基础对象指针。也即辅助类用以封装使用计数与基础对象指针。...答案当然是能,那就是使用模板技术。为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...这里贴上上面的智能指针类的模板版: //模板类作为友元时要先有声明 template class SmartPtr; template class
::initializer_list,允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普通数组和 POD 的初始化方法提供了统一的桥梁,例如: #include 模板增强 外部模板 传统 C++ 中,模板只有在使用时才会被编译器实例化。只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。...至于闭包类中是否有对应成员,C++ 标准中给出的答案是:不清楚的,与具体实现有关。...,所以 lambda 表达式的闭包与一个类对象绑定在一起了,这很危险,因为你仍然有可能在类对象析构后使用这个 lambda 表达式,那么类似“悬挂引用”的问题也会产生。...它可以绑定任何类函数对象,只要参数与返回类型相同。
但它缺了点东 西: 这个类只适用于 shape 类 该类对象的行为不够像指针 拷贝该类对象会引发程序行为 1.手写auto_ptr与scope_ptr 针对"这个类只适用于 shape 类",我们想到了模板...,而不是带参数的移动构造,再调用移动赋值 unique_ptr ptr4(std::move(new circle)); // ok 调用带模板的移动构造 } 调用与结果如上代码所示...(2)第二种:移动构造与带模板的移动构造同时存在,可以完成子类向基类的转换,此时是满足上述生成规则,此时不会生成拷贝函数!...> } 小结: (1)我们需要了解子类向基类的隐式转换,通过将移动构造函数变为带模板的移动构造函数,要明白两者共存情况与只有带模板的移动或者其他构造函数对编译器生成规则的影响!...根据前面提到的,当类中特殊函数变为带模板的函数,编译器仍然会生成默认拷贝构造与默认移动构造。
【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等...STL stack是一个模板类,要使用它,必须包含头文件。它是一个泛型类,允许在顶部插入和删除元素,而不允许访问中间的元素。从这种角度看,std::stack的行为很像一叠盘子。...标准模板库(STL)提供了可帮助组织与操作位信息的类。...//copySmartFish = smartFish; //unique_ptr复制赋值运算符是私有的 return 0; } 处理文件 C++使用std:fstream...使用stringstream进行字符串转化 C++中的stringstream类是最有用的工具之一,让您能够执行众多的转换操作。要包含头文件#include
可变参数的模板 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。...6.2 可变参数模板类 6.2.1 继承方式展开参数包 可变参数模板类的展开一般需要定义2 ~ 3个类,包含类声明和特化的模板类: template class BMW{};...:需要将一组参数原封不动的传递给另一个函数。...智能指针 C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针(smart pointer),定义在中。...C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。
使用它时应当注意: 1,不要将已存在裸指针交由 shared_ptr,任何形式的智能指针都不应该去托管已有的裸指针。 2,作为函数参数传递时,请传递引用。...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。...【Example】C++ 标准库常用容器全面概述 【Example】C++ 回调函数及 std::function 与 std::bind 【Example】C++ 运算符重载 【Example】C++...标准库智能指针 unique_ptr 与 shared_ptr 【Example】C++ 接口(抽象类)概念讲解及例子演示 【Example】C++ 虚基类与虚继承 (菱形继承问题) 【Example...】C++ Template (模板)概念讲解及编译避坑 【Example】C++ 标准库 std::thread 与 std::mutex 【Example】C++ 标准库多线程同步及数据共享 (std
智能指针是一个模板类,以能够管理任何类型的指针引用的内存,如果模板参数是一个有公有成员的类,那么还能使用->访问其成员。...初始化 共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针shared_ptr 是一个模板类,如果要进行初始化有三种方式:通过构造函数、std::make_shared辅助函数以及...由于在堆区的引用计数和同一类型的智能指针是绑定在一起的,当智能指针释放资源时,也需要释放引用计数占用的内存。...::weak_ptr底层与std::shared_ptr共享相同的引用计数机制,但不会增加计数。...与 shared_ptr 不同,weak_ptr 不能直接访问所指向的对象。要访问对象,需要先调用 lock() 方法将其转换为 shared_ptr。
3.函数重载支持 nullptr可以与函数重载一起使用,特别是当涉及到指针和整数类型的重载时,nullptr可以明确指定调用哪个版本的函数。...4.与智能指针的交互 nullptr可以与C++的智能指针(如std::unique_ptr、std::shared_ptr等)一起使用,用于初始化或表示智能指针不拥有任何资源的情况。...::cout std::endl; } else { // 处理ptr指向的数据 } } 3.与智能指针一起使用...智能指针如std::unique_ptr和std::shared_ptr可以使用nullptr来初始化或表示空指针。...std::unique_ptr uptr = nullptr; std::shared_ptr sptr = nullptr; 4.模板代码中的使用 在模板代码中,nullptr
利用模板,您可以定义类或函数的操作,并允许用户指定这些操作应使用的具体类型。 总结:模板是 C++ 当中支持参数类型与返回值动态化的工具,使开发人员可以动态自定义函数、类中参数与返回值类型。...模板又分为两种:函数模板 与 类模板。...> 3,模板与完整泛型编程的区别(编译避坑) C++ 的模板类在没有被使用之前,编译器完全不知道它会占用多少空间!...【Example】C++ 回调函数及 std::function 与 std::bind 【Example】C++ 运算符重载 【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr...】C++ 标准库 std::thread 与 std::mutex 【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise) 【Example】C+
因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用 make_unique Helper 函数。...这个类的所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类的友元。这个辅助类含有两个数据成员:计数count与基础对象指针。...也即辅助类用以封装使用计数与基础对象指针。...但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用吗?答案当然是能,那就是使用模板技术。为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...这里贴上上面的智能指针类的模板版: //模板类作为友元时要先有声明 template class SmartPtr; //辅助类 template
①unique_ptr 在C++中,unique_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源,它提供了自动释放内存的功能。...指针语义:unique_ptr的使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象的成员。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。...②shared_ptr 在C++中,shared_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源。...使用 lock() 获取 shared_ptr:要操作 weak_ptr 所观察的对象,可以使用 lock() 函数获取一个有效的 shared_ptr。
智能指针是行为类似于指针的类对象,但这种对象还有其他功能。使用指针指向一块新申请的内存的过程中,有时忘记释放新申请的内存,导致内存泄漏。为了防止该问题的发生,C++提供了智能指针模板类。...最大的区别就在于当一个智能指针的所有权被剥夺后,若后面的程序要调用它的时候,unique_ptr直接在编译阶段就失败,将问题暴露出来,而auto_ptr编译阶段不会报错,在程序运行的时候出现异常,因此unique_ptr...我们知道delete与new配对,delete[]与new[]配对,而auto_ptr中使用的是delete,而不是delete[],因此只能与new一起使用,不能与new[]一起使用。...但unique_ptr有delete和delete[]两个版本,它可以与new一起使用,也可以与new[]一起使用。同样的,shared_ptr也支持与new一起使用,不支持new[]的使用。...注:使用new分配内存时,可以使用auto_ptr、unique_ptr、shared_ptr;使用new[]分配内存时,不能使用auto_ptr和shared_ptr,可以使用unique_ptr;不使用
标准库中提供了相应的类模板,它们可以将任何数据类型封装成智能指针,使用它们时,需要引入头文件。...智能指针常用的类模板有: std::unique_ptr std::shared_ptr std::weak_ptr 由上述的类模板可以生成三种类型的智能指针实例。...2.智能指针的基础用法 1.智能指针的初始化 智能指针是基于类模板生成的,因此,要初始化一个智能指针,就必须声明指针所指向的数据类型,不然智能指针里面包含的原始指针是个空指针。...2.使用make functions在堆上分配资源 例如,使用std::make_unique或std::make_shared来实例化资源,然后将它包装成一个资源管理对象去管理资源以及智能指针...至于为何要采用上述规则,后面会新增动态内存分配和右值引用等相关章节来详细说明。
智能指针在C++库中已有现成的可以使用,比如auto_ptr, weak_ptr, share_ptr, unique_Ptr等,这些针对上述拷贝的问题都有不同的方法解决: 3.3 std::auto_ptr...在拷贝构造函数中,与传入对象一起管理它管理的资源,同时将该资源对应的引用计数++。...+标准库中实现shared_ptr时是分成了很多个类的,因此C++标准库中可以将删除器的类型设置为构造函数的模板参数,然后将删除器的类型在各个类之间进行传递。...但我们是直接用一个类来模拟实现shared_ptr的,因此不能将删除器的类型设置为构造函数的模板参数。...要在当前模拟实现的shared_ptr的基础上支持定制删除器,就只能给shared_ptr类再增加一个模板参数,在构造shared_ptr对象时就需要指定删除器的类型。
删除器的基本概念 在C++中,智能指针(Smart Pointers)如std::unique_ptr和std::shared_ptr默认使用delete或delete[]来释放内存。...1.1 默认删除器 默认情况下,std::unique_ptr和std::shared_ptr使用以下方式进行删除: delete ptr; delete[] arr_ptr; 这些删除器在大多数情况下都很有用...1.2.2 代码可读性和维护性 使用自定义删除器可以提高代码的可读性和维护性。它使资源的获取和释放逻辑紧密地绑定在一起,从而减少了出错的机会。...<< ptr << endl; fclose(ptr); } }; int main() { //使用自定义的fclose模板 std::unique_ptr up...使用std::unique_ptr(唯一指针)或std::shared_ptr(共享指针)时,你可以将函数对象作为第二个模板参数传递。
领取专属 10元无门槛券
手把手带您无忧上云