C++20 Concepts 概念
concept 定义约束、requires 子句、标准概念库、错误提示改善
C++20 Concepts 概念
模板的错误信息晦涩难懂?Concepts 在编译前就检查类型约束——错误清晰,IDE 友好。
学完本章你将: 掌握 concept 定义约束、requires 子句、标准概念库。
定义 concept
cpp
#include <concepts>
// 定义一个概念:支持 + 运算
template <typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> std::same_as<T>; // a + b 的结果是 T 类型
};
// 使用 concept 约束模板
template <Addable T>
T add(T a, T b) { return a + b; }
add(1, 2); // ✅
add("a", "b"); // ❌ 编译错误——清晰:string 不满足 Addable
requires 子句
cpp
// 方式 1:requires 子句
template <typename T>
requires std::integral<T>
T multiply(T a, T b) { return a * b; }
// 方式 2:concept 替代 typename
template <std::integral T>
T multiply(T a, T b) { return a * b; }
// 方式 3:简写
auto multiply(std::integral auto a, std::integral auto b) {
return a * b; // C++20 函数模板简写
}
标准概念库
cpp
std::integral<T> // 整数类型
std::floating_point<T> // 浮点类型
std::same_as<T, U> // 同一类型
std::derived_from<T, U> // 继承关系
std::convertible_to<T, U> // 可转换
std::movable<T> // 可移动
std::copyable<T> // 可拷贝