0

0

c++20中的概念(Concepts)有什么用_c++20 Concepts语法与泛型约束应用

下次还敢

下次还敢

发布时间:2025-11-17 08:34:02

|

1005人浏览过

|

来源于php中文网

原创

Concepts 提供编译期类型约束,解决模板错误信息晦涩问题。通过定义 Addable 等约束条件,可明确要求类型支持特定操作;结合 std::integral、std::equality_comparable 等标准概念,能编写安全且易读的泛型代码,提升开发效率与代码可靠性。

c++20中的概念(concepts)有什么用_c++20 concepts语法与泛型约束应用

C++20 的 Concepts 解决了模板编程中长期存在的问题:类型约束不明确、错误信息晦涩难懂。在 Concepts 出现之前,泛型代码依赖 SFINAE 或 requires 表达式(C++20 前)来限制模板参数,但这些方法复杂且报错信息对用户极不友好。Concepts 提供了一种清晰、可读性强的方式来定义对模板参数的约束,让编译器能在早期发现问题,并给出更直观的提示。

什么是 Concepts?

Concepts 是一种用于约束模板参数的机制,它允许你为类型指定“必须满足什么条件”。比如,你可以要求一个类型支持加法操作、必须是整数,或具备迭代器行为。这种约束不是运行时检查,而是在编译期进行验证。

示例:定义一个简单 Concept

下面定义一个 Concept,要求类型支持加法操作:

template
concept Addable = requires(T a, T b) {
a + b;
};

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

现在可以用这个 Concept 来约束函数模板:

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

如果你传入一个不支持 + 操作的类,编译器会直接提示:“类型不满足 Addable 约束”,而不是展开一长串模板实例化失败的信息。

常用标准 Concept 与泛型约束实践

C++20 在 头文件中提供了许多预定义的 Concept,可以直接使用:

  • std::integral:类型必须是整型(如 int, char, bool)
  • std::floating_point:浮点类型(float, double)
  • std::default_constructible:可默认构造
  • std::copyable:可复制
  • std::equality_comparable:支持 == 和 !=
实际应用:安全的比较函数

你想写一个函数,只接受能比较相等的类型:

海螺视频
海螺视频

海螺AI推出的AI视频生成工具,可以生成高质量的视频内容。

下载

#include 

template
bool isEqual(const T& a, const T& b) {
return a == b;
}

如果传入两个不可比较的自定义类型,编译器立刻报错并指出哪个 Concept 未满足,极大提升开发效率。

结合 requires 表达式编写复杂约束

除了组合已有 Concept,还可以用 requires 编写更复杂的逻辑判断。

示例:要求类型有 size() 成员函数

template
concept HasSize = requires(const T& t) {
t.size();
{ t.size() } -> std::convertible_to;
};

这里不仅检查是否存在 size(),还通过返回类型约束确保其结果能转为 size_t,增强了安全性。

在类模板中使用 Concepts

Concepts 不仅可用于函数模板,也能用于类模板特化或约束构造函数。

示例:容器只接受可复制的类型

template
class MyVector {
// ...
};

这样,尝试用不可复制的类型实例化 MyVector 会立即被阻止。

基本上就这些。Concepts 让泛型编程从“靠运气编译”变成了“有规可循”,显著提升了代码可读性与维护性。合理使用 Concepts,可以写出既高效又安全的模板代码。不复杂但容易忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

575

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

421

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号