讲师中心 微信公众号
AI工具推荐 视频效率加速

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

胖涛君_5656

胖涛君_5656

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

|

1025人浏览过

|

来源于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<typename T><br>concept Addable = requires(T a, T b) {<br>    a + b;<br>};

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

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

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

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

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

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

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

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

#include <concepts><br><br>template<std::equality_comparable T><br>bool isEqual(const T& a, const T& b) {<br>    return a == b;<br>}

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

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

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

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

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

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

在类模板中使用 Concepts

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

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

template<std::copyable T><br>class MyVector {<br>    // ...<br>};

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

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

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

6867

2024.04.28

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

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

804

2025.10.23

string转int
string转int

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

6679

2023.08.02

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

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

3225

2024.08.29

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

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

4188

2025.08.29

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

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

2865

2025.08.29

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

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

4188

2025.08.29

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

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

804

2025.10.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn