
现代C++
文章平均质量分 89
丁金金_chihiro_修行
be better boy man
展开
-
实现遍历Windows所有字体的基本属性
【代码】实现遍历Windows所有字体的基本属性。原创 2025-02-28 21:39:33 · 382 阅读 · 0 评论 -
FontConfig封装分享
【代码】FontConfig封装分享。原创 2025-02-19 23:25:14 · 277 阅读 · 0 评论 -
“现代C++ RAII库:设计、优化及实战应用“
make_raii: 简化了raii对象的创建,适用于需要通过类成员函数管理资源的情况。: 简化了raii_var对象的创建,适用于需要通过普通函数或可调用对象管理资源的情况。这两个辅助函数的主要目的是减少样板代码,使资源管理更加简洁和安全。通过它们,你可以更方便地利用 RAII 模式来确保资源的正确获取和释放,无论是在单线程还是多线程环境中。原创 2025-02-08 23:40:48 · 1551 阅读 · 0 评论 -
std::function 在 C++ 中的使用总结
是 C++ 标准库中的一个模板类,用于包装任何可调用对象(如普通函数、lambda 表达式、成员函数或仿函数)。它主要用于编写通用代码,允许将函数作为参数传递给其他函数(回调机制),从而避免为相似的回调函数创建额外的重载版本。 定义在 头文件中。要创建一个包装器对象,首先需要声明它:: 包装器的名字。: 函数接受的参数类型列表。: 函数的返回类型。初始化上述语法仅创建了一个空的 实例。为了包装一个具体的函数到这个包装器对象中,可以使用赋值操作符:其中 是要被包装的函数。也可以在声明时初原创 2025-02-08 22:42:51 · 788 阅读 · 0 评论 -
现代C++ 21 any
是 C++17 引入的一个类,用于表示一个类型安全的容器,可以存储任何可复制构造类型的单个值。它提供了一种灵活的方式来处理不同类型的对象,而不需要提前知道具体的类型。是 C++17 引入的一个非常灵活的工具,特别适用于需要存储和处理不同类型值的场景。的设计目标是提供一种通用的、类型安全的方式来进行值的存储和访问。如果你有更多具体的问题或需要进一步的帮助,请随时提问!原创 2024-12-09 00:44:05 · 582 阅读 · 0 评论 -
现代C++20 variant
是 C++17 引入的一个非常有用的工具,特别适用于需要在多个不同类型之间切换的场景。它提供了类型安全的联合体功能,并且通过。提供了更强的类型安全性和更丰富的功能。它可以在任何给定时间包含多个备用类型之一的值,并且可以处理这些类型的转换和访问。在任何给定时间点要么包含其备用类型之一的值,要么在错误的情况下不包含任何值(这种情况很少见,通常发生在异常抛出时)。是 C++17 引入的一个类模板,用于表示类型安全的联合体(union)。如果你有更多具体的问题或需要进一步的帮助,请随时提问!中的值变得非常方便。原创 2024-12-09 00:41:09 · 1044 阅读 · 0 评论 -
现代C++ 19 expected
是 C++23 引入的一个非常强大的工具,特别适用于处理可能失败的操作。它提供了一种清晰且安全的方式来表示成功值和错误值,并且通过丰富的单子操作(如。总是包含一个值,无论是成功值还是错误值。这使得它在处理函数返回值时更加灵活和强大,尤其是在需要区分成功和失败的情况下。它提供了一种更安全、更清晰的方式来处理可能失败的操作,相比于传统的返回值加错误码的方式,是 C++23 引入的一个类模板,用于表示两种可能的值之一:一个预期的成功值(类型为。这使得它非常适合用于函数返回值,尤其是那些可能会失败的操作。原创 2024-12-09 00:40:17 · 1171 阅读 · 0 评论 -
现代C++ 18 optional
是 C++17 引入的一个类模板,用于管理一个可能包含值也可能不包含值的对象。它提供了一种更安全、更清晰的方式来处理可能失败的操作或可选的返回值,相比使用指针(如。是 C++ 标准库中一个非常有用的功能,特别适用于处理可能失败的操作或可选的返回值。它提供了清晰的语法和丰富的功能,使得代码更加安全和易读。对象在任何给定时间点要么包含一个值,要么不包含值。,你可以避免使用指针或布尔标志来表示是否存在值,从而减少了潜在的错误和复杂性。如果你有更多具体的问题或需要进一步的帮助,请随时提问!更加直观和易于理解。原创 2024-12-09 00:38:34 · 830 阅读 · 0 评论 -
现代C++17 tuple
是 C++ 标准库中一个非常强大的工具,特别适用于需要将多个不同类型的数据组合在一起的情况。的“形状”——它的尺寸、元素类型和这些类型的排序——是其类型签名的组成部分,因此它们必须在编译时都可用,并且只能依赖于其他编译时信息。进行许多条件操作——尤其是条件前缀/后缀和过滤——只有在条件可以在编译时进行评估的情况下才有可能。是 C++ 标准库中的一个类模板,用于表示固定大小的异构值集合。中的元素解包到单独的对象中,或者创建一个由引用组成的。的泛化版本,允许存储任意数量的不同类型的元素。的析构函数是平凡的。原创 2024-12-09 00:37:32 · 1122 阅读 · 0 评论 -
现代C++16 pair
你还可以通过提供自定义的比较函数来控制std::set中std::pair的排序方式。例如,如果你想只根据pair的second// 自定义比较函数,只比较 second 元素// 创建一个 std::set,使用自定义比较函数// 插入一些 pair// 遍历 set 并输出元素return 0;原创 2024-12-09 00:36:05 · 1205 阅读 · 0 评论 -
现代C++ 15 整数比较
这些函数定义在头文件。原创 2024-12-09 00:34:53 · 627 阅读 · 0 评论 -
现代C++14 交换
是 C++ 标准库中的一个通用函数,用于交换两个对象的值。它最初定义在头文件 中,但从 C++11 开始,它的主要定义被移动到了头文件 中,而数组的特化版本仍然可以在 中找到。此外,某些特定类型的 特化可能在其他头文件中定义,例如 。 的基本形式如下:这个模板函数接受两个引用参数 和 ,并交换它们的值。 的行为是通过调用 类型的移动构造函数和移动赋值运算符来实现的,因此要求 必须满足 和 。 规范:从 C++11 开始, 可以被标记为 ,具体取决于 的移动构造和移动赋值操作是否是 的。原创 2024-12-09 00:33:11 · 1577 阅读 · 0 评论 -
现代 C++13 hash
你可以定义一个独立的哈希函数对象,并将其作为无序容器的第二个模板参数传递。原创 2024-12-09 00:31:58 · 1087 阅读 · 0 评论 -
现代C++12 函数对象
在 C++ 中,函数对象(也称为仿函数或functor)是指实现了函数调用运算符operator()的对象。这意味着你可以像调用普通函数一样调用这些对象。C++ 标准库提供了多种内置的函数对象,并且用户也可以定义自己的函数对象。更高的灵活性:可以将函数对象作为参数传递给其他函数或算法。状态保持:与普通函数不同,函数对象可以拥有内部状态,允许它们在多次调用之间保持信息。更好的性能:编译器可以对函数对象进行内联优化,而普通函数指针通常无法享受这种优化。原创 2024-12-09 00:29:41 · 1409 阅读 · 0 评论 -
现代C++ 12 内存管理库,智能指针
可以用于管理任何类型的自定义资源,例如操作系统句柄、文件描述符等。// 自定义删除器,用于关闭文件描述符close(fd);// 使用 std::unique_ptr 管理文件描述符// 打开文件并创建 unique_ptrreturn 1;// 写入文件\n";// 文件描述符会在离开作用域时自动关闭return 0;这些示例展示了在各种场景下的应用,包括文件资源、线程资源、数据库连接、动态数组、多态对象链表、共享内存、自定义资源(如句柄)以及网络套接字。通过使用。原创 2024-12-09 00:28:20 · 924 阅读 · 0 评论 -
现代C++ 11 类
在 C++ 中,类()、结构体()和联合体()是用户定义的类型,它们由类说明符(class specifier)定义。类说明符出现在声明语法中的 中。以下是类声明的详细解释,包括其语法、成员规范、前向声明、局部类等内容。类声明的基本语法如下:: 关键字,可以是 、 或 。 和 的主要区别在于默认的成员访问控制:: 默认成员为 ,默认基类继承为 。: 默认成员为 ,默认基类继承为 。: 声明联合体,所有成员共享同一块内存。: 从 C++11 开始,可以在类声明前添加任意数量的属性原创 2024-12-08 21:55:50 · 945 阅读 · 0 评论 -
现代C++ 10 语句
C++ 的if语句提供了强大的条件控制功能,并且随着 C++17 和 C++23 的引入,新增了和等特性,使得编译期优化和立即函数的使用变得更加灵活和高效。理解这些特性可以帮助你编写更简洁、更高效的代码,特别是在模板编程和编译期计算的场景中。C++ 的switch语句提供了一种简洁的方式来处理多个离散的值匹配情况。通过case和default标签,你可以轻松地控制程序的执行路径。此外,switch语句还支持一些高级特性,如属性、初始化语句和类类型的隐式转换,使得代码更加灵活和强大。原创 2024-12-08 21:51:59 · 805 阅读 · 0 评论 -
现代C++ 9 函数
函数声明(Function Declaration)在 C++ 中用于引入函数的名字和类型,而函数定义(Function Definition)则将函数名/类型与函数体关联起来。函数声明可以在任何作用域中出现,包括全局作用域、命名空间作用域、类作用域等。函数声明的基本形式如下:或者使用尾置返回类型(Trailing Return Type)的形式:: 任何有效的声明符,但若以 , , 或 开头,则必须用括号包围。: 可能为空,逗号分隔的参数列表。: 或 限定符,仅允许在非静态成员函数声明中。原创 2024-12-08 21:50:49 · 2213 阅读 · 0 评论 -
现代C++ 8 初始化
用户声明的构造函数(C++11 之前)或用户提供的、继承的或显式的构造函数(C++11 之后),以及从 C++20 开始,没有用户声明的或继承的构造函数。私有或受保护的直接非静态数据成员。基类(直到 C++17),或者虚拟基类,或者私有或受保护的直接基类(自 C++17 起)。虚拟成员函数。默认成员初始化器(C++11 之后)。列表初始化是自 C++11 引入的一种初始化方式,它允许使用花括号括起来的初始化列表来初始化对象。原创 2024-12-08 21:49:23 · 1000 阅读 · 0 评论 -
现代C++ 7 初始化
用户声明的构造函数(C++11 之前)或用户提供的、继承的或显式的构造函数(C++11 之后),以及从 C++20 开始,没有用户声明的或继承的构造函数。私有或受保护的直接非静态数据成员。基类(直到 C++17),或者虚拟基类,或者私有或受保护的直接基类(自 C++17 起)。虚拟成员函数。默认成员初始化器(C++11 之后)。列表初始化是自 C++11 引入的一种初始化方式,它允许使用花括号括起来的初始化列表来初始化对象。原创 2024-12-08 21:48:12 · 850 阅读 · 0 评论 -
现代C++ 6 声明
在C++中,**冲突声明(Conflicting Declarations)**是指两个或多个声明试图引入相同的实体(如变量、函数、类等),但这些声明之间存在不兼容之处。为了避免歧义和潜在的错误,C++标准对冲突声明进行了严格的限制。以下是关于冲突声明的详细总结:两个声明被认为是对应的,如果它们满足以下条件之一:如果两个声明是对应的,但声明了不同的实体,则它们是潜在冲突的声明。两个函数声明被认为是对应的重载,如果它们满足以下所有条件:两个函数模板声明被认为是对应的重载,如果它们满足以下所有条件:如果两个声明原创 2024-12-08 10:43:39 · 1444 阅读 · 0 评论 -
现代C++5 运算符
在 C++ 中,成员访问运算符用于访问对象或指针所指向对象的成员。C++ 允许这些运算符被重载(除了少数例外),以便为自定义类提供类似内置类型的语法糖。以下是 C++ 中成员访问运算符的详细总结:说明:示例:2. 间接寻址运算符 语法:可重载:是原型示例:在类定义内:在类定义外:说明:示例:3. 取地址运算符 语法:可重载:是原型示例:在类定义内:在类定义外:说明:示例:4. 对象的成员访问运算符 语法:可重载:否原型示例:不适用说明:示例:5原创 2024-12-08 00:57:00 · 1829 阅读 · 0 评论 -
现代C++ 3.基本概念补充(二)
C++ 语言中的定义和**单一定义规则(ODR)**是确保程序正确性和一致性的关键概念。下面我们将详细解释这两个概念,并提供一些具体的例子来帮助理解。在 C++ 中,友元函数(friend function)是一种特殊类型的函数,它不是类的成员,但可以访问该类的私有和保护成员。友元函数可以在类的内部或外部定义,其名称查找规则根据定义的位置有所不同。未定义行为。原创 2024-12-07 23:22:03 · 764 阅读 · 0 评论 -
现代C++ 2.基本概念补充(一)
C++ 的类型系统是语言的核心组成部分,它不仅定义了数据的存储方式,还限制了可以对这些数据执行的操作,并赋予了位序列以语义意义。C++ 的类型系统非常丰富,涵盖了基本类型、复合类型以及用户自定义类型。以下是对 C++ 类型系统的详细总结。C++ 的类型系统非常强大且灵活,涵盖了从基本类型到复杂用户定义类型的广泛范围。通过理解不同类型及其属性,开发者可以编写更加安全、高效和可维护的代码。原创 2024-12-07 22:53:51 · 1044 阅读 · 0 评论 -
现代C++ 基本概念
C++ 是一种复杂的编程语言,包含了许多特定的术语和概念。关键字:是C++语言中具有特殊含义的保留字,不能用作标识符。它们用于定义语言的语法和结构。标识符:是由程序员定义的名称,用于命名变量、函数、类等实体。标识符必须遵循命名规则,并且不能与关键字冲突。注释:是用于解释代码的文本,编译器在翻译过程中会忽略注释。注释分为单行注释和多行注释。字面量:是直接出现在程序中的常量值,表示具体的数值、字符、字符串等。字面量的值由字符集和编码确定。转义序列。原创 2024-12-07 22:11:39 · 1288 阅读 · 0 评论