新闻中心

C++ C++20的concepts怎么用_C++20概念与模板约束使用方法

2025-11-20
浏览次数:
返回列表
C++20的concepts允许为模板参数定义约束,提升代码可读性和错误提示;通过concept关键字定义谓词,如Integral或Addable,并结合requires表达式检查操作合法性;标准库提供std::integral等常用concept,可应用于函数、类模板及简写函数语法,增强类型安全与编译时检查。

c++ c++20的concepts怎么用_c++20概念与模板约束使用方法

在C++20中,concepts 是一个重要的新特性,它允许我们为模板参数指定清晰的约束条件,从而提升代码的可读性、可维护性和编译错误信息的友好程度。相比以前只能靠SFINAE或requires表达式“隐式”限制模板,现在可以显式声明哪些类型是合法的。

什么是Concepts?

Concept是一个编译时谓词(即返回true或false),用于约束模板参数。它可以看作是对类型的一组要求,比如“这个类型必须支持加法操作”或者“必须是整数类型”。

定义一个concept使用 concept 关键字,后接名称和一个布尔表达式:

template<typename T>
concept Integral = std::is_integral_v<T>;

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

上面的例子中,Integral 是一个concept,只有整型类型(如int、long等)才能实例化add函数。

如何定义和使用自定义Concept

除了基于类型特征(type traits)定义concept,还可以通过requires表达式来检查操作是否合法。

template<typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::convertible_to<T>;
};

这段代码表示:类型T必须支持+操作,并且结果能转换为T本身。这样就能确保加法行为符合预期。

然后你可以用它来约束函数模板:

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

若传入不支持+操作的类或结果类型不匹配,编译器会直接报错指出违反了Addable约束,而不是抛出一长串模板实例化失败的信息。

标准库中的常用Concepts

C++20标准库在头文件中提供了许多预定义的concept,例如:

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀
  • std::integral:整型类型
  • std::floating_point:浮点类型
  • std::default_constructible:可默认构造
  • std::copyable:可复制
  • std::equality_comparable:支持==操作

可以直接使用它们来简化约束:

#include <concepts>

template<std::integral T>
void process_integer(T value) {
    // 只接受整型
}

在类模板中使用Concepts

concepts同样适用于类模板。你可以在类模板参数列表中加入约束:

template<typename T>
concept Printable = requires(T t) {
    std::cout << t;
};

template<Printable T>
struct Logger {
    void log(const T& value) {
        std::cout << "Value: " << value << '\n';
    }
};

如果T不支持输出到std::cout,编译就会在模板定义处报错,提示哪个要求没满足。

函数参数中的简写语法(abbreviated function template)

C++20还支持一种更简洁的写法,直接在函数参数中使用concept名称:

void scale(std::integral auto& x, int factor) {
    x *= factor;
}

这等价于:

template<std::integral T>
void scale(T& x, int factor);

这种写法适合简单场景,让代码看起来更接近普通函数,但功能仍是模板。

基本上就这些。合理使用concepts能让模板编程更安全、易懂,也能大幅改善错误提示。刚开始可能觉得requires表达式有点复杂,但一旦掌握常见模式,写起来就很自然了。

以上就是C++ C++20的concepts怎么用_C++20概念与模板约束使用方法的详细内容,更多请关注其它相关文章!


# 还可以  # seo站长搜行者SEO  # seo平台技术火 星7  # 个人网站建设运营费用  # 龙安区祥云seo  # seo运营电脑  # 微生物分类单元网站建设  # 网站营销推广平台  # 装饰行业网站建设方案  # 唐山seo优化收费  # 钉钉seo怎么写  # 就能  # 你可以  # ai  # 边缘  # 错误提示  # 报错  # 不支持  # 游戏开发  # 整型  # 是一个  # 标准库  # 代码可读性  # 编译错误  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 汽车之家官方网站官网入口_汽车之家网页版直接进入  顺丰国际快递查询 国际件官方查询入口  React中useState与局部变量:理解组件状态管理与渲染机制  新手怎么开始学化妆 零基础化妆入门教程  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  Go RPC HTTP服务正确实现与常见陷阱解析  Kafka Streams中基于消息头条件过滤消息的实现指南  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  SteamMachine定价或为699美元 大家想入手吗?  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  Win11怎么开启高性能模式_Windows 11电源计划优化设置  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  海量存储:机器视觉智能化的核心基石  AO3访问入口汇总 AO3网页版同人作品一键直达  Lar*el DB::listen 事件中的查询执行时间单位解析  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  Animex动漫社网入口地址 Animex动漫社网正版在线入口  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  顺丰快递查单号物流信息 顺丰快递小程序查询入口  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  Excel文件在线转换快速入口 Excel在线格式转换网站  J*a TimerTask中HashMap意外清空的深层原因与解决方案  抖音网页版平台入口 抖音网页版官网在线访问教程  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  优化Django表单:提交验证失败后保留用户输入  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  痛风发作了怎么办? 快速止痛和后期饮食调理  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  C#中解析不规范的HTML为XML 常见的坑与解决办法  动漫岛观看全网网 动漫岛在线正版动漫入口  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示 

搜索