C++ Concepts:模板约束的现代化
学习如何使用C++20概念对模板参数进行精确约束,提升代码可读性和错误提示质量。 · 难度:入门 · +15XP
什么是概念(Concepts)?
C++20引入了概念,它是一种编译期谓词,用于指定模板参数必须满足的语义和语法要求。概念让模板错误信息从冗长的实例化回溯变为清晰的约束违反提示。
定义概念
使用concept关键字定义概念,通常与requires表达式结合。
#include <concepts>
#include <iostream>
template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T add(T a, T b) {
return a + b;
}
int main() {
std::cout << add(3, 4) << '
'; // 正确
// add(3.0, 4.0); // 编译错误:不满足Integral
}
复合概念与requires子句
概念可以组合多个约束,并检查表达式合法性。
template<typename T>
concept Comparable = requires(T a, T b) {
{ a < b } -> std::convertible_to<bool>;
};
template<Comparable T>
T max(T a, T b) {
return a < b ? b : a;
}
概念 vs. SFINAE
| 特性 | 概念 | SFINAE |
|---|---|---|
| 可读性 | 高,显式命名 | 低,依赖模板技巧 |
| 错误信息 | 清晰直接 | 冗长复杂 |
| 性能 | 相同(编译期) | 相同 |
练习提示
尝试定义一个名为Printable的概念,要求类型支持operator<<(std::ostream&),然后编写一个函数模板使用该概念。