当前位置: 首页 > news >正文

C++23 ranges::range_adaptor_closure:程序定义的范围适配器闭包的辅助类

文章目录

        • 一、背景介绍
        • 二、`ranges::range_adaptor_closure` 的定义与要求
        • 三、使用示例
        • 四、编译器支持情况
        • 五、总结

一、背景介绍

C++23 引入了 std::ranges::range_adaptor_closure,这是一个辅助类模板,用于定义用户自定义的范围适配器闭包对象。这一特性主要来源于 P2387R3 提案,旨在支持用户定义的范围适配器与标准库视图适配器在管道表达式中的互操作。

二、ranges::range_adaptor_closure 的定义与要求

std::ranges::range_adaptor_closure 是一个类模板,用于确保用户定义的类型 T 是一个范围适配器闭包对象。具体要求如下:

  1. 单参数函数对象T 必须是一个单参数函数对象,接受一个范围作为参数。
  2. 单一基类T 必须恰好有一个公共基类 std::ranges::range_adaptor_closure<T>,且不能有其他类型的 std::ranges::range_adaptor_closure<U> 作为基类。
  3. 非范围类型T 本身不能是一个范围。
三、使用示例

以下是一个使用 std::ranges::range_adaptor_closure 的示例,展示如何定义一个简单的范围适配器闭包对象:

#include <ranges>
#include <string_view>
#include <iostream>// 定义一个范围适配器闭包对象
struct Slice : std::ranges::range_adaptor_closure<Slice>
{std::size_t start = 0;std::size_t end = std::string_view::npos;constexpr std::string_view operator()(std::string_view sv) const{return sv.substr(start, end - start);}
};int main()
{constexpr std::string_view str = "01234567";// 使用 Slice 作为普通函数对象constexpr Slice slicer{.start = 1, .end = 6};constexpr auto sv1 = slicer(str);std::cout << "sv1: " << sv1 << std::endl;// 使用 Slice 作为范围适配器闭包对象constexpr auto sv2 = str | slicer;std::cout << "sv2: " << sv2 << std::endl;// 范围适配器闭包可以组合constexpr auto slice_and_drop = slicer | std::views::drop(2);std::cout << "slice_and_drop: " << str | slice_and_drop << std::endl;
}
四、编译器支持情况

截至 2023 年 5 月,主流编译器对 std::ranges::range_adaptor_closure 的支持情况如下:

编译器支持情况
GCC libstdc++13(部分支持),14 完全支持
Clang libc++19 完全支持
MSVC STL19.34 完全支持
Apple Clang未明确支持
五、总结

C++23 的 std::ranges::range_adaptor_closure 提供了一种强大的机制,允许开发者定义自己的范围适配器闭包对象,并与标准库中的视图适配器无缝互操作。这一特性极大地增强了 C++ 范围库的灵活性和表达能力,使得范围操作更加简洁和高效。

相关文章:

  • Starrocks的主键表涉及到的MOR Delete+Insert更新策略
  • 【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.4 模型部署与定期评估
  • 从HTTP轮询到WebSocket:如何让体育API性能提升100倍?
  • 【Python 中文编码】
  • 关于网站提交搜索引擎
  • Protobuf工具
  • C语言 ——— 函数栈帧的创建和销毁
  • Kafka 解惑
  • 你对于JVM底层的理解
  • Python面向对象编程(OOP)深度解析:从封装到继承的多维度实践
  • Room持久化库:从零到一的全面解析与实战
  • 5. 动画/过渡模块 - 交互式仪表盘
  • 车载网关作为车辆网络系统的核心枢纽
  • spark MySQL数据库配置
  • 基于 Amazon Bedrock 和 Amazon Connect 打造智能客服自助服务 – 设计篇
  • 涌现理论:连接万物的神秘力量
  • Kafka、RabbitMQ、RocketMQ的区别
  • 地址簿模块-01.需求分析
  • python训练营day23
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 外交部亚洲司司长刘劲松会见印度驻华大使罗国栋
  • 继71路之后,上海中心城区将迎来第二条中运量公交
  • 在对国宝的探索中,让美育浸润小学校园与家庭
  • 国羽用冠军开启奥运周期,林丹:希望洛杉矶奥运取得更好成绩
  • 农行深圳市分行原副行长王国彪涉嫌严重违纪违法被查