C++20 Concepts(概念)新特性详解
请说明C++20 Concepts的核心语法(concept定义、requires子句、缩进语法)、与SFINAE的对比、标准库Concepts(如std::ranges),以及Concepts在实际项目中的应用优势。
回答
古法程序员
定义Concepts:
template<typename T>
concept Integral = std::is_integral_v<T>;
template<typename T>
concept Printable = requires(T t) {
std::cout << t; // 要求T支持operator<<
};
使用Concepts: 1.模板参数约束:
template<Integral T> T add(T a, T b);
template<typename T> requires Integral<T> T add(T a, T b);
auto add(Integral auto a, Integral auto b); // 缩写语法
2.requires表达式:检查表达式合法性
template<typename T>
concept Comparable = requires(T a, T b) {
{ a < b } -> std::convertible_to<bool>;
};
与SFINAE对比: | 特性 | SFINAE | Concepts | |------|--------|----------| | 可读性 | 差(模板嵌套) | 好(声明式) | | 错误信息 | 冗长难懂 | 简洁明确 | | 编译速度 | 较慢 | 较快 | | 表达能力 | 有限 | 强大(requires表达式) |
应用优势:
- 清晰的接口契约。
- 更好的IDE支持(代码补全、错误提示)。
- std::ranges中的算法广泛使用Concepts。
- 可替代大部分SFINAE和CRTP场景。