c++怎么使用C++20的Concepts_c++20概念系统(Concepts)的语法与应用


C++20的Concepts通过定义类型约束提升模板编程的可读性和错误提示清晰度。使用concept关键字和requires表达式可创建自定义约束,如Addable要求支持加法操作;标准库提供std::integral等常用Concept;可用于函数和类模板参数限制,并支持基于约束的重载,使编译错误更明确,代码更易维护。

c++怎么使用c++20的concepts_c++20概念系统(concepts)的语法与应用

C++20 的 Concepts 是一个强大的泛型编程工具,它允许你在编译期对模板参数施加约束,从而提升代码的可读性、可维护性和错误提示的清晰度。过去我们写模板时,如果传入了不合适的类型,编译错误往往是一长串难以理解的模板展开信息。而 Concepts 能让这些错误变得直观明了。

什么是 Concepts?

Concepts 是一种用于限制模板参数类型的机制。你可以把它看作“类型的要求清单”——只有满足这些要求的类型才能被用作模板实参。

例如,你希望某个函数模板只接受支持加法操作的类型(比如 int、double),就可以定义一个 Concept 来表达这个条件。

基本语法:如何定义和使用 Concept

定义 Concept 使用 concept 关键字,后接名称、等号以及一个布尔表达式。

示例:定义一个支持加法的类型约束

template<typename T>
concept Addable = requires(T a, T b) {
    a + b; // 检查是否能执行 a + b
};

然后在模板中使用:

template<Addable T>
T add(T a, T b) {
    return a + b;
}

现在调用 add(1, 2) 没问题,但如果你传入一个不支持 + 的类或指针类型,编译器会明确告诉你:“该类型不满足 Addable Concept”。

requires 表达式的几种形式

requires 是构建 Concept 的核心,它可以检查多种语义:

  • 简单要求(Simple requirement):只要表达式合法即可
requires(T t) { t++; }
  • 复合要求(Compound requirement):用花括号包裹,并可指定 noexcept 和返回类型
requires(T t) { { t++ } noexcept -> std::same_as<T>; }
  • 类型要求(Type requirement):检查某个类型是否存在
template<typename T>
concept HasValueType = requires {
    typename T::value_type; // 要求 T 有嵌套类型 value_type
};
  • 常量要求(Constant requirement):直接判断一个布尔值
concept Even = (4 % 2 == 0); // 总为 true,仅作演示

在函数模板中的应用

除了上面的 <addable t></addable> 写法,还有其他方式使用 Concept:

  • 使用 requires 子句
template<typename T>
T multiply(T a, T b) requires requires(T t){ t * t; }
{
    return a * b;
}
  • 结合 auto 使用(C++20 简化写法)
auto add(Addable auto a, Addable auto b) {
    return a + b;
}

这等价于:

芝士饼 芝士饼

芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。

芝士饼 84 查看详情 芝士饼
template<Addable T, Addable U>
auto add(T a, U b) { ... }

标准库中的常用 Concept

C++20 标准库在 <concepts></concepts> 头文件中提供了许多预定义的 Concept,可以直接使用:

  • std::integral:整型类型(int, char, bool 等)
  • std::floating_point:浮点类型(float, double)
  • std::default_constructible:可默认构造
  • std::copyable:可复制
  • std::equality_comparable:支持 == 和 !=

例子:只接受整数的函数

#include <concepts>
<p>void process(std::integral auto value) {
// 只能传入整型
}

在类模板中使用 Concept

也可以用来约束类模板参数:

template<typename T>
requires std::integral<T>
class Wrapper {
    T data;
public:
    Wrapper(T d) : data(d) {}
};

或者更简洁地:

template<std::integral T>
class Wrapper { ... };

优势与实际意义

  • 更好的编译错误信息:不再是一堆模板推导失败的堆栈,而是“你的类型不满足 XXX Concept”
  • 提高接口清晰度:从函数签名就能看出对类型的期望
  • 支持重载基于 Concept:可以根据不同的 Concept 提供多个函数版本

示例:根据 Concept 重载函数

void print(auto x) {
    std::cout << "任意类型: " << x << '\n';
}
<p>void print(std::integral auto x) {
std::cout << "整数: " << x << '\n';
}</p><p>void print(std::floating_point auto x) {
std::cout << "浮点数: " << x << '\n';
}

调用 print(42) 会匹配整数版本,print(3.14) 匹配浮点版本。

基本上就这些。Concepts 让模板编程从“靠运气通过编译”变成“有明确契约的类型系统”,是现代 C++ 泛型编程的重要进步。刚开始可能觉得 requires 写法有点复杂,但一旦掌握,你会觉得没有 Concepts 的模板很难再回头用了。

以上就是c++++怎么使用C++20的Concepts_c++20概念系统(Concepts)的语法与应用的详细内容,更多请关注其它相关文章!


# 错误提示  # 江门品牌seo推广托管  # 大良网站建设技术  # 网站建设行业需求  # 辽宁网站建设途径有什么  # 日照建设网站价格  # 青岛网站优化设计软件  # 垫江抖音seo费用  # 如何找到官媒网站推广  # 建水推广营销招聘网站  # 平遥牛肉营销软文推广  # 子句  # 是一种  # 如果你  # c++20  # 返回值  # 不满足  # 浮点  # 整型  # 是一个  # 芝士  # 标准库  # 编译错误  # c++  # 栈  # 工具  # app  # concepts 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  QQ网站入口直接登录 QQ官方正版登录页面  Python实时数据流中高效查找最大最小值  mail.qq.com登录入口 QQ邮箱网页版直达  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  AO3官方镜像链接 | 最新防走失网址永久收藏  Python中安全地将环境变量转换为整数的类型注解指南  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南  抖音赚钱快速入门_新手必看的抖音赚钱步骤  抖音网页版官方链接 抖音网页版官网链接入口  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  德邦物流在线查询系统 德邦快递货物运输追踪  poki官网最新入口 poki小游戏大全入口  sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧  我的世界游戏平台入口 我的世界官方官网直达链接  使用document.execCommand实现Web文本编辑器加粗/取消加粗  使用VS Code作为你的个人知识管理系统  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  小红书网页版首页入口 小红书网页版电脑端官方登录链接  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  Win10怎么设置快速启动 Win10开启快速启动设置方法  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  Python模块化编程:避免循环导入与共享函数的最佳实践  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  教育查询官方网站入口 教育个人档案查询免费官网  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  《单词速记宝》设置学习计划方法  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  空腹吃苹果好吗 苹果空腹摄入指南  除了Copilot,还有哪些值得一试的VS Code AI插件?  iphone16系列配置参数介绍  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  全球各国上班时间表外贸邮件时间  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  Dash应用多值文本输入处理与类型转换教程  mysql中如何配置字符集和排序规则_mysql字符集排序配置  Python对象引用与属性赋值:理解链表中的行为  视频转蓝光m2ts格式  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  天天漫画2025最新入口 天天漫画永久有效登录入口  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  Flexbox布局:实现粘性导航与底部页脚的完美结合  优化Flask模板中SQLAlchemy查询迭代标签:处理字符串空格问题  《狐友》联系客服方法  顺丰快递在线查询系统 顺丰快递官方查单入口  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  《爱笔思画x》涂色教程 

 2025-11-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.