9、C++ 20:Ranges与定制点的深入解析

C++ 20:Ranges与定制点的深入解析

1. C++ Ranges概述

在C++中,视图(views)是一种强大的工具,用于适配其他范围(ranges)。像 std::ranges::transform_view 这样的视图,通常会将底层范围作为数据成员存储。这意味着,由于 transform_view 承诺能在常量时间内完成复制操作,它所包含的数据成员也必须能在常量时间内完成复制。

视图理论上似乎只能适配其他视图,但实际上,只要视图不获取范围的所有权,非视图范围也是可以接受的。这一要求由 std::ranges::viewable_range 概念定义,即“视图或对非视图范围的左值引用”。在实际应用中,视图通常要求底层范围是视图,并通过值或复制的方式存储;如果从对其他类型范围的引用构造视图,它会将该范围包装在 std::ranges::ref_view 中并存储。

std::ranges::ref_view 是一种特殊的视图,它存储一个指向给定范围的指针,并将所引用范围的 begin end 暴露为自己的接口。与 std::span 不同,它没有类型擦除效果,但更具通用性,可以包装任何范围,而不仅仅是连续范围。

2. 范围适配器对象

在组合多个视图时,传统的定义方式可能会导致代码复杂且难以维护。为了解决这个问题,引入了范围适配器对象(Range Adaptor Objects)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值