c++中如何使用C++20的Concepts进行类型约束_c++20 Concepts类型约束用法

38次阅读

c++20 的 Concepts 提供编译期类型约束,提升模板 代码可读性 与安全性。使用 concept 定义谓词如 Integral 限制模板参数,结合 std::integral 等 标准库 concept 可精确控制类型要求,支持逻辑组合与 requires 表达式检查操作合法性及返回类型,适用于函数与 类模板,使错误提示更清晰。

c++ 中如何使用 C ++20 的 Concepts 进行类型约束_c++20 Concepts 类型约束用法

C++20 引入了 Concepts,用来对模板参数进行约束,使编译器能在编译期检查类型是否满足特定要求。相比传统的 SFINAE 或 static_assert,Concepts 提供了更清晰、可读性更强的语法来限制模板类型。

定义和使用基本 Concept

Concept 是一个编译期谓词,用于描述类型必须满足的条件。使用 concept 关键字定义:

template<typename T> concept Integral = std::is_integral_v<T>; <p>template<Integral T> T add(T a, T b) {return a + b;}</p>

上面定义了一个名为 Integral 的 concept,它要求类型 T 必须是 整型。函数 add 只接受满足该 constraint 的类型。如果传入 double,编译器会直接报错,并提示类型不满足 constraint。

使用 标准库 中的 Concepts

C++20 标准库在 <concepts> 头文件中提供了常用 concepts,例如:

立即学习C++ 免费学习笔记(深入)”;

  • std::integral:整型类型
  • std::floating_point:浮点类型
  • std::default_constructible:可默认构造
  • std::copyable:可复制
  • std::equality_comparable:支持 == 操作

可以直接在模板中使用:

#include <concepts> <p>template<std::integral T> T multiply(T a, T b) {return a * b;}</p>

组合多个约束

可以使用逻辑 运算符 组合多个 constraints:

c++ 中如何使用 C ++20 的 Concepts 进行类型约束_c++20 Concepts 类型约束用法

无阶未来模型擂台 /AI 应用平台

无阶未来模型擂台 /AI 应用平台,一站式模型 + 应用平台

c++ 中如何使用 C ++20 的 Concepts 进行类型约束_c++20 Concepts 类型约束用法35

查看详情 c++ 中如何使用 C ++20 的 Concepts 进行类型约束_c++20 Concepts 类型约束用法

template<typename T> concept Numeric = std::integral<T> || std::floating_point<T>; <p>template<Numeric T> T maximum(T a, T b) {return a > b ? a : b;}</p>

这个 Numeric concept 接受整型或浮点类型。也可以用 &amp;&amp; 表示“与”关系:

template<typename T> concept SignedIntegral = std::integral<T> &amp;&amp; std::is_signed_v<T>;

在类模板中使用 Concepts

Concepts 同样适用于类模板:

template<typename T> concept Printable = requires(T t) {std::cout << t;}; <p>template<Printable T> struct Logger {void log(const T& value) {std::cout << "Value: " << value << 'n';} };</p>

这里使用了 requires 表达式 来检查类型是否支持被输出到 std::cout

requires 表达式的进阶用法

除了检查表达式合法性,还可以检查返回类型、异常等:

template<typename T> concept Addable = requires(T a, T b) {{ a + b} -> std::same_as<T>; // 要求 a+b 返回 T 类型 };

这个 constraint 确保加法操作返回的是相同类型。

基本上就这些。Concepts 让模板编程更安全、更易读,错误信息也更友好。合理使用能显著提升代码质量。

站长
版权声明:本站原创文章,由 站长 2025-10-30发表,共计1595字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources