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

在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标准库在
小云雀
剪映出品的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《神剑少女战记》发布实机演示


2025-11-20
浏览次数:次
返回列表
e<Addable T>
T add(T a, T b) { return a + b; }