在C++20中引入的Concepts(概念)为模板编程提供了一种新的语义方式,能够在编译阶段对模板参数进行更精确的约束,从而产生更清晰的错误信息并提升代码可读性。本文从基本语法、实现思路、常见错误处理以及实践案例四个方面展开,帮助你快速上手并将Concepts应用到自己的项目中。
1. 什么是Concepts
Concepts是一种对模板参数进行逻辑约束的机制,类似于类型约束,但语义更直观。它们允许我们用类似函数参数的方式声明对类型的期望,并在编译时进行静态检查。
2. 基本语法
// 定义一个Concept
template<typename T>
concept Integral = std::is_integral_v <T>;
// 使用Concept
template<Integral T>
T add(T a, T b) {
return a + b;
}
上面代码定义了一个名为Integral的Concept,要求类型T满足`std::is_integral_v
`。随后在`add`函数中使用该Concept作为模板参数约束。
## 3. 组合与命名约定
Concepts可以通过逻辑运算符进行组合,从而形成更复杂的约束。
“`cpp
template
concept Arithmetic = Integral
|| std::is_floating_point_v;
template
T multiply(T a, T b) {
return a * b;
}
“`
命名约定建议使用驼峰式并以名词或形容词结尾(如`Container`、`Movable`),以增强可读性。
## 4. 约束中的参数化
Concepts本身也可以带参数,形成“参数化概念”。
“`cpp
template
concept LessThanComparable = requires(T a, U b) {
{ a std::convertible_to;
};
“`
此处`LessThanComparable`要求`T`与`U`之间可以使用`
#include
#include
#include
template
concept RandomAccessContainer = requires(T a, T b, std::size_t i) {
{ a.begin() } -> std::same_as;
{ a.end() } -> std::same_as;
{ a[i] } -> std::same_as;
};
template<randomaccesscontainer container typename comp="std::less>
void generic_sort(Container& c, Comp comp = Comp{}) {
std::sort(c.begin(), c.end(), comp);
}
int main() {
std::vector
v = {5, 2, 9, 1};
generic_sort(v);
for (int n : v) std::cout