在C++20标准发布后,程序员们对语言的新特性充满了好奇。本文将重点介绍三项核心改进:模块化(Modules)、概念(Concepts)以及协程(Coroutines),并通过实战示例展示它们在实际项目中的价值。
1. 模块化(Modules)
1.1 为什么需要模块化
传统的头文件包含方式存在多重编译、编译时间长、符号冲突等问题。模块化通过把代码划分为可独立编译的单元,解决了这些痛点。
1.2 基本语法
// math_module.cppm
export module math; // 声明模块名称
export int add(int a, int b) { return a + b; } // export 表示对外可见
// main.cpp
import math; // 引入模块
#include <iostream>
int main() {
std::cout << add(3, 5) << '\n'; // 结果 8
}
1.3 编译流程
- 第一阶段:编译
math_module.cppm,生成模块接口文件math.pcm。 - 第二阶段:编译
main.cpp时直接引用math.pcm,不需要再次编译math_module.cppm。
这大幅度缩短了编译时间,尤其在大型项目中收益显著。
2. 概念(Concepts)
2.1 概念的意义
概念为模板提供了“接口约束”,使错误信息更易读,模板错误定位更直观。
2.2 定义一个概念
template<typename T>
concept Incrementable = requires(T x) {
{ ++x } -> std::same_as<T&>;
{ x++ } -> std::same_as <T>;
};
2.3 使用概念
template<Incrementable T>
T safe_increment(T& val) {
return ++val;
}
当 T 不满足 Incrementable 时,编译器会给出“无法满足概念 Incrementable”的错误,而不是一堆模糊的模板错误。
2.4 实战:泛型排序
template<std::input_iterator Iter, std::weakly_incrementable It>
requires std::sortable <Iter>
void quick_sort(Iter first, Iter last) {
if (first == last) return;
// 简化实现...
}
使用 std::sortable 概念保证了传入迭代器满足排序所需的比较与移动语义,提升代码可读性和安全性。
3. 协程(Coroutines)
3.1 协程概念
协程是轻量级的“暂停与恢复”机制,适用于异步 IO、生成器、状态机等场景。
3.2 基础语法
#include <coroutine>
#include <iostream>
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() {}
};
};
Task hello() {
std::cout << "Hello ";
co_return;
}
int main() {
hello(); // 输出 Hello
}
3.3 异步 IO 示例
#include <iostream>
#include <experimental/io> // 或者使用 std::experimental::net
#include <coroutine>
Task read_file_async(const std::string& path) {
std::ifstream file(path);
std::string line;
while (std::getline(file, line)) {
co_yield line; // 逐行返回
}
}
协程使得异步代码更像同步,避免回调地狱,易于维护。
4. 如何在项目中落地
- 开启模块:在编译器选项中启用
-fmodules-ts或-std=c++20。 - 逐步迁移:先将核心库拆分为模块,再逐步替换头文件。
- 使用概念约束:在关键模板处加入概念,降低错误率。
- 引入协程:对需要高并发或事件驱动的模块使用协程,配合
std::async、std::future或第三方网络库。
5. 结语
C++20 的模块化、概念与协程三大特性从根本上提升了语言的可维护性、可读性和性能。只要善加利用,它们能让我们写出更安全、更高效、更现代化的 C++ 代码。
祝你在 C++ 的新旅程中编码愉快!