Concepts 是 C++20 将模板隐式契约显性化的核心特性,支持 requires 约束、命名 concept 定义、auto 参数推导及类模板特化,显著提升接口清晰度、错误提示质量与代码可维护性。

Concepts 是 C++20 引入的核心特性,它让模板参数的约束从“运行时失败”或“编译器报一长串错误”的黑盒状态,变成**可读、可复用、可推导的显式契约**。用好 Concepts,不是给模板加个装饰,而是从根本上提升接口清晰度、错误提示质量和代码可维护性。
用 requires 表达式快速约束单个模板参数
最轻量的用法是直接在函数模板或类模板声明处使用 requires 子句,检查类型是否满足一组条件:
- 例如要求类型支持
+和==,且结果可转为bool:
template
requires std::is_arithmetic_v
requires(T a, T b) { { a + b } -> std::same_as
T add_if_equal(T x, T y) { return x == y ? x + y : x; }
这种写法适合一次性、小范围约束,无需提前定义 concept 名称,但可读性略低,复用性差。
定义命名 Concept 提升可读性与复用性
把常见约束封装成具名 concept,就像定义接口一样清晰:
立即学习“C++免费学习笔记(深入)”;
template
concept Addable = requires(T a, T b) {
{ a + b } -> std::same_as
};
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::convertible_to
};
template
T sum(T a, T b) { return a + b; }
template
T combine_if_equal(T a, T b, U x, U y) {
return (x == y) ? a + b : a;
}
命名 concept 可组合(如 concept IntegralAddable = std::integral<t> && Addable<t></t></t>),便于文档化、测试和团队协作。
Concept 与 auto 推导结合:让函数参数更安全、更直观
C++20 允许在函数参数中直接使用 concept 名称替代 auto,这比传统模板更简洁,又比裸 auto 更严格:
还木有评论哦,快来抢沙发吧~