在 C++(尤其是 C++20 引入 Concepts 之后)中,Concept/Model(概念/模型)是一种非常强大的泛型编程范式。它不仅能让你的模板代码更安全、可读性更高,还能实现优雅的运行时多态(类似于接口,但没有虚函数表的开销)。
为了让你、、彻底搞懂它,我们把它拆成两部分来看:
1. C++20 原生的 Concepts 语法(编译期的约束)
2. 经典的 Concept/Model 设计模式(用模板实现非侵入式多态)
C++20 中的 Concept 与 Model (编译期)
在 C++20 中,Concept(概念)*是对类型的一种约束(Constraint)。如果一个具体类型满足了这个 Concept 的要求,我们就可以说这个类型是该 Concept 的一个 Model(模型)。
核心概念
Concept (概念):定义了类型必须具备的能力(比如:必须可迭代、必须有 draw() 方法、必须是整数等)。
Model (模型):满足 Concept 条件的具体数据类型。
我们给一个简单的实例
#include <iostream> #include <concepts> // 1. 定义一个 Concept:要求类型必须有 draw() 方法 template<typename T> concept Drawable = requires(T t) { { t.draw() } -> std::same_as<void>; // 必须有 draw() 且返回 void }; // 2. 定义两个 Model(具体类型) struct Circle { void draw() const { std::cout << "Draw Circle\n"; } }; struct Text { void draw() const { std::cout << "Draw Text\n"; } }; struct Secret {