25k 22 分钟

本文记录了阅读 BS_thread_pool 源码时的一些知识点,最好结合源码一起食用。 BS_thread_pool 是 github 一个开源的线程池,源码地址:thread-pool # i、invoke_result_t 1using concurrency_t = std::invoke_result_t<decltype(std::thread::hardware_concurrency)>; 这行代码定义了一个别名 concurrency_t ,该别名代表 std::thread::hardware_concurrency...
9.1k 8 分钟

参考链接:Google C++ Style Guide # 头文件 每个 .cpp 源文件都应该有一个相对应的 .h 头文件 每个头文件都应该有头文件守卫,守卫格式统一为: _<PROJECT>_<PATH>_<FILE>_H_ 对于头文件中对于 inline 内联函数的定义,要求函数体在十行以内,且不包括循环、switch 语句。 头文件的 include 顺序:相关头文件、C 系统头文件、C++ 头文件、其他库头文件、项目头文件 (这里的 “相关头文件” 指的是与该源文件同名的头文件) #...
3.4k 3 分钟

# 一、可变参数模板 #CPP11 # 1. 概述 C++ 的可变参数模板(Variadic Templates)是一种强大的特性,使得模板能够接受可变数量的参数。这一特性引入于 C++11,允许程序员创建更加灵活和通用的代码。 可变参数模板使得函数模板和类模板能够接受任意数量的模板参数,无论是类型参数还是非类型参数。它们为泛型编程提供了更大的灵活性。 # 2. 基本语法 可以通过使用省略号 ... 来定义参数包。 函数模板: 1234template<typename... Args>void func(Args... args) { //...
1.4k 1 分钟

# i、lambda 表达式 vs 函数 在 C++ 中,定义 lambda 表达式和定义普通函数有以下几个区别和好处: 简洁性:相对于显式定义一个命名函数,lambda 表达式更加简洁。您可以在需要的地方直接定义 lambda 表达式,而无需显式命名函数。 匿名性:lambda 表达式是匿名的,它不需要命名,并且可以直接作为参数传递给其他函数或算法。 上下文捕获:lambda 表达式可以捕获外部作用域中的变量,包括局部变量、函数参数等。这使得它们能够在函数对象中保持状态,并在需要时访问和修改这些变量。 类型推导:lambda 表达式可以通过类型推导来自动推断其参数类型和返回类型。这使得编写...
1.6k 1 分钟

extern "C" 是 C++ 中用于与 C 语言进行互操作的重要关键字。它主要用于告诉编译器在链接阶段如何处理函数或变量名。下面是详细介绍 extern "C" 的背景、用途、以及使用方法: # 1. 背景: 在 C 和 C++ 中,函数和变量的符号是通过名字来链接的,但 C++ 使用了 "名字修饰"(Name Mangling)来支持函数重载等特性。这种修饰会导致编译器生成的函数名不再是原始的函数名,而是带有类名、参数类型等信息的复杂字符串。 例如,C++ 中一个函数 int...
6.5k 6 分钟

# 一、概述 C++ 异常机制是一种用于处理程序运行时错误和异常情况的机制。它允许在发生异常时抛出异常对象(通过 throw 语句),并在适当的地方捕获并处理这些异常(通过 try-catch 块)。 异常的基本流程如下: throw 语句:当程序运行到某个错误或异常的情况时,可以使用 throw 语句抛出一个异常对象。异常对象可以是内置类型、自定义类型或标准库中的异常类。 try-catch 块:使用 try 关键字开始一个代码块,该代码块可能会抛出异常。在 try 块中,程序会监视是否有异常被抛出,如果有,就会跳到与之匹配的 catch 块。 catch 块: catch...
6.9k 6 分钟

# 一、C++ 文件 IO 读写 参考教程:C++ 文件和流 在读写文件的时候,每读取或者写入一个字节,磁盘中的文件指针就会向后移动一个字节。可以通过控制指针的位置,以便在我们需要的位置进行读写文件: tellg()  返回读取文件指针的当前位置 tellp()  返回写入文件指针的当前位置 seekg(指针偏移量)  将读取文件指针移到指定位置 seekg(指针偏移量,参照位置)  将读取文件指针移到指定位置 seekp(指针偏移量)  将写入文件指针移到指定位置 seekp(指针偏移量,参照位置)...
33k 30 分钟

# i、右值引用 # 概述 右值引用是 C++11 引入的一种新的引用类型,用于支持移动语义和完美转发。与传统的左值引用(左值引用)不同,右值引用绑定到临时对象、将要销毁的对象或者显式转换为右值引用的对象。右值引用的特点是可以接管资源,并实现高效的资源移动操作。 在 C++ 中,我们可以通过在类型名称前添加 && 来声明右值引用。例如, int&&...
9.5k 9 分钟

# i、C++ 抽象类 # ii、什么是抽象类 在 C++ 中,抽象类是一个特殊的类,它包含了至少一个纯虚函数(pure virtual function)。纯虚函数是在函数声明后面加上 "= 0"...
5.4k 5 分钟

# 一、概述 C++ 中的流(streams)是用于处理输入和输出的抽象概念,主要用于与设备(如键盘、屏幕、文件等)进行数据交互。流在 C++ 中主要由以下几个方面组成: # 1. 流的类型 C++ 中有两种主要的流类型: 输入流(Input Stream):用于从输入设备读取数据。最常用的输入流是 std::cin ,它用于从标准输入(通常是键盘)读取数据。 输出流(Output Stream):用于将数据输出到输出设备。最常用的输出流是 std::cout ,它用于将数据输出到标准输出(通常是屏幕)。 # 2. 流的类 在 C++...