C++之Concept

C++20四大之三:concept特性详解 前言:C++模板的演进 模板的演进是C++发展史中一条十分重要的线,个人觉得Concept是这条线中最大的一个特性了。在介绍Concept之前,我们先捋一捋模板这条线的发展。 据Stroustrup先生回忆, 对模板的设想早在1982年便有了,正式提出是在1998年的 USENIX C++ conference会议上提出,设计模板的初衷是因为当时的C++缺少一个标准库,而当时没有模板的C++很难设计出“vector、list”这种适用于多种类型的容器。 到1998年模板正式进入标准,在这之前C++模板已经 阅读详情

STL中的Concept和Boost库的Concept_Check

在generic programming当中,一个重要的概念就是concept(滑稽的是,如果把这个concept也翻译成“概念”,那就狗屁不通了。我倾向于说它是“操作集”)。concept就是一组操作,如果一个type具有这些操作,那么就说这个type是这个concept的一个model。
这其中的思想有那么一丁点像是oo当中的interface,一个class如果实现了一个interface,那么它就可以被当作这个interface来用。同样,如果一个type是一个concept的model,那么所有接受这个concept的操作也就可以接受这个type。
例如,在stl中,stable_sort这个算法必须接受randomaccessiterator,这里randomaccessiterator就是一个concept,它规定自己的model必须可以进行下标运算,那么不满足这个concept的type就无法被编译器接受(搞笑的是我在vc71里面把list<int> 的iterator传给stable_sort,它居然欣然接受,要知道list的iterator应该只是一个bidirectionaliterator 啊,比randomaccessiterator弱多了。不过仔细看看代码,发现vc71的stable_sort接受bidirectionaliterator就够了,不知道是好还是坏)。在gcc下面如果传递一个bidirectionaliterator给stable_sort,会得到一堆不知所云的错误提示,让人摸不着头脑。
c++语言本身并没有对于concept的直接支持,stl解决这个问题的办法是用了一些traits来限制iterator的特性,以达到在编译时期检查concept的目的。但是traits导致的编译错误提示实在是太可怕了,我非常怀疑有哪个正常人可以从这些错误提示推测出自己错在哪里。
在boost库里面,提供了一个conceptcheck库,它可以帮助我们写出带有concept检查的代码,而且没有运行时的开销,一旦用户违反concept限制,输出的错误提示也比较好懂。举个例子先,如果stl里面有conceptcheck,那么它的stable_sort大约会这样:
#include <boost/concept_check.hpp>
template <class randomaccessiter>
void stable_sort(randomaccessiter first, randomaccessiter last)
{
    function_requires< randomaccessiteratorconcept<randomaccessiter> >();
    //... bla bla bla......
}
有了这个 function_requires ,如果再传递给它list的iterator,编译器(vc71)就会报这样的错:


c:\boost_1_31_0\boost\concept_check.hpp(642): error c2676: 二进制“+=” : “std::list<_ty>::iterator”不定义该运算符或到预定义运算符可接收的类型的转换
        with
        [
            _ty=int
        ]
当然还有很多别的,但是至少它说了一点:传入的iterator不满足某个运算。这对于用户来说,应当是一个很有用的提示。
使用concept check还有一个额外的好处,那就是调用一个 function_requires可远比写一些traits容易,而且代码也清晰好维护。

这个好用的 function_requires 就定义在concept_check.hpp当中:
template <class concept>
inline void function_requires(mpl::identity<concept>* = 0)
{
#if !defined(ndebug)
  void (concept::*x)() = boost_fptr concept::constraints;
  ignore_unused_variable_warning(x);
#endif
}
换句话说,function_requires只在debug中起作用,那么是不是在debug当中它就添加了overhead呢?其实也没有,仔细看看代码:
void (concept::*x)() = boost_fptr concept::constraints;
这一句取constraints的地址。妙就妙在它让编译器“注意到”constraints,但又没有真正调用constraints,而constraints是一个虚函数,做实际的check。例如在randomaccessiteratorconcept(检查iterator是否符合randomaccessiterator的concept)当中,constraint是这个样子:
template <class tt>
struct randomaccessiteratorconcept
{
    void constraints() {
    function_requires< bidirectionaliteratorconcept<tt> >();
    function_requires< comparableconcept<tt> >();
#ifndef boost_no_std_iterator_traits
    typedef typename std::iterator_traits<tt>::iterator_category c;
    function_requires< convertibleconcept< c,
        std::random_access_iterator_tag> >();
    typedef typename std::iterator_traits<tt>::reference r;
#endif

    i += n;             // require assignment addition operator
    i = i + n; i = n + i; // require addition with difference type
    i -= n;             // require assignment subtraction operator
    i = i - n;                  // require subtraction with difference type
    n = i - j;                  // require difference operator
    (void)i[n];                 // require element access operator
    }
    tt a, b;
    tt i, j;
#ifndef boost_no_std_iterator_traits
    typename std::iterator_traits<tt>::difference_type n;
#else
    std::ptrdiff_t n;
#endif
};
从这个实现中我们完全可以读出randomaccessiterator的具体含义:
1. 它必须是一个bidirectionaliterator
2. 它必须满足“可比较 (comparable)”的concept
3. 它还必须满足“可转换 (convertible)”的concept,而且是转换成自己的iterator_category类别

4. 它必须定义了reference这个type
5. 这是最重要的,它必须有difference_type,而且可以进行 +, -, +=, -= 的运算
还要记得,由于这个函数没有真正的被调用过,所以无论你怎么写,它都不会变成实际的代码,所以也不会影响运行效率的!

C++20 新功能concept的使用 使用C++20提供的concept关键字,引入概念,使得模板的使用更加高效、简洁与易用 阅读详情

相关推荐

C++的Concept/Model模式

在 C++ 中提及 Concept/Model,通常指的是这两种语境:*C++20 现代语境:用来给模板参数“立规矩”(Concept),看某个具体类型(Model)符不符合要求。它是编译期的,用来替代复杂的 std::enable_if。经典设计模式语境:用来做类型擦除。通过在包装类内部构建 Concept 基类和 Model<T> 模板子类,实现非侵入式的运行时多态。std::function 和 std::any 都是这种模式的工业级实现。

fangfanglovezhou的博客 199

STL中的Concept和Boost库的Concept_Check

在Generic Programming当中,一个重要的概念就是Concept(滑稽的是,如果把这个Concept也翻译成“概念”,那就狗屁不通了。我倾向于说它是“操作集”)。Concept就是一组操作,如果一个type具有这些操作,那么就说这个type是这个Concept的一个model。这其中的思想有那么一丁点像是OO当中的interface,一个class如果实现了一个interface,那...

feipigwang 595

Doris + Iceberg 实现高效数据湖分层:架构解析与最佳实践

本文深入解析了如何利用Doris与Iceberg构建高效的数据湖冷热分层架构。通过将高频访问的热数据存储在Doris中以实现毫秒级查询,同时将历史冷数据归档至低成本的Iceberg存储,该方案在保障查询性能的同时显著降低了总体拥有成本。文章详细阐述了从架构设计、自动化迁移到统一查询的最佳实践,为应对海量数据下的成本与性能平衡提供了实战指南。

weixin_29207533的博客 135

C++20之Concept(概念部分,之一)

本篇介绍了C++20中的一个重要概念——concept

fl2011sx的博客 3843

Halcon频域滤波实战:5分钟搞定傅里叶变换与功率谱分析(附完整代码)

本文提供Halcon频域滤波的实战指南,重点讲解如何利用傅里叶变换与功率谱分析快速解决图像处理难题。通过核心算子fft_image和power_real,演示了从空间域转换到频域、分析功率谱以定位周期性噪声,并构造滤波器进行精准去除的完整流程,附有可直接运行的代码示例。

docker8compose的博客 215

【WRF编译-Lab1】使用自动脚本编译WRF:错误总结

WRF编译过程及错误总结

WW、forever的博客 83

C++20中头文件concepts的使用

C++20中头文件concepts的使用

网络资源是无限的 1312

XPATH注入漏洞检测工具汇总

环境 > Python3.7。

墨痕诉清风的博客 742

std::enable_if 与concepts 作用与例子分析

是 C++11 中引入的一个模板编程特性,它用于在模板定义中启用或禁用特定的模板实例化。通过使用,开发者可以基于编译时条件来控制模板函数、模板类或者模板成员函数的实例化。通常与 SFINAE(Substitution Failure Is Not An Error)原则一起使用,来实现在函数重载中基于类型特征的函数名称修饰(name mangling)。

winsons_lu的博客 832

YOLOv8 改进涨点 | 模块即插即用 直接可用

在目标检测任务中,注意力机制能够帮助模型聚焦于图像中的关键区域,显著提升检测精度。。创建模块代码注册模块修改任务解析tasks.py创建YAML配置文件模块核心优势适用场景计算开销SOCA捕获二阶统计信息,增强通道间相关性需要精细特征区分的场景中等SK自适应多尺度核选择多尺度目标检测中等偏高显式特征聚集-分配机制全局上下文建模中等A2-Net双线性注意力,高效全局交互复杂场景理解中等偏高CrissCross线性复杂度全局上下文高分辨率输入,长距离依赖较低。

u012133341的博客 2258

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5326

C++20:从0到1学懂concept

目录1.concept语法1.1 替换typename1.2 requires关键字1.4 concept与auto2.编译器支持3.总结C++20引入了concept(概念),是对模板参数(编译时评估)的一组约束。你可以将它们用于类模板和函数模板来控制函数重载和特化。一些优点包括:对模版参数强制类型约束提高代码可读性(替换了较长的SFINAE代码)提供更友好的报错信息通过限制可以使用的类型来防止...

Francis的博客 1722

Spring AI从入门到精通:构建智能Spring应用的全面指南

随着人工智能技术的快速发展,将大语言模型(LLM)与企业应用集成已成为趋势。Spring AI作为Spring官方推出的AI集成框架,为开发者提供了便捷、标准化的方式来构建智能应用。本文将从基础概念到高级应用,全面介绍Spring AI的核心功能与实践技巧。Spring AI 是 VMware 于 2023 年推出的开源框架,旨在简化大语言模型(LLM)与 Spring 应用的集成。它提供了统一的 API 抽象,支持多种 LLM 供应商,包括 OpenAI、Azure OpenAI、Hugging Face

qq_36929638的博客 1069

c++20 concept

Visual Studio 2019今天发布了16.3版本更新,加入了C++20的concept支持,在此记录一下concept的用法: 1.限制只能打印int类型 //std::enable_if实现 template <typename T> void print_int(std::enable_if_t<std::is_same_v<int, std::decay_t...

Lilong的博客 4263

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4212

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++中的concept

C++中的concept

weixin_73622063的博客 701

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++20学习:concept用法介绍

概述 众所周知,C++的泛型强大,很多语言都学了,比如C#、Java,虽然Java的泛型只是语法糖,不值得一提。 C++的template实际上是创造了一种新的语言,这个语言是编译期的,相当于编译器把代码解释成C++语言,然后再编译成机器指令。STL的诞生,是颠覆性的创举,然而STL所用到的泛型还只是C++template中其中一部分特性。 C++使用template实现泛型算法,我们来看下一个简单的例子。 template<typename T> T inc(T a) { return

追风筝的人的专栏 1918

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《C++0x漫谈》系列之:Concept, Concept!

《C++0x漫谈》系列之:Concept, Concept! By 刘未鹏(pongba)C++的罗浮宫(http://blog.youkuaiyun.com/pongba)  《C++0x漫谈》系列导言 这个系列其实早就想写了,断断续续关注C++0x也大约有两年余了,其间看着各个重要proposals一路review过来:rvalue-references,concepts,memory-model,v

移动开发与培训 333

如何在Cpp20之前实现concept?SFINAE

C++17 SFINAE从理论到实践

weixin_41733034的博客 606

一文速通 C++ concept —— 学会对类型提要求

本节我们将学习比SFINAE更现代的用法:C++20 concept。相信至此,大部分的C++元编程你都能够看懂啦~

weixin_41733034的博客 646

C++雾中风景18:C++20, 从concept开始

转眼间,C++20的标准已经发布快两年了。不少C++的开源项目也已经将标准升级到最新的C++20了,笔者也开启了新标准的学习历程了。所以借这系列的博文,记录下笔者学习新标准的一些心得与吐槽~~ 作为C++20系列的第一篇开篇之文,就要从千呼万唤始处理的concept聊起了,后续很多新的feature的实现,也仰赖新的concept的实现,后续笔者的文章也会逐步展开。OK,开始我们C++20旅程的第一站:concept 1.First Look 先从一个群友的一个实际的问题出发,我们来看看concep.

weixin_39827856的博客 613
上一篇: MFC之很重要的地方之输入焦点的传递
下一篇: MFC之CFont
gyafdxis
博客等级 码龄12年 6粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值