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

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++ 范围库的灵活性和表达能力,使得范围操作更加简洁和高效。

http://www.xdnf.cn/news/6023.html

相关文章:

  • flutter Stream 有哪两种订阅模式。
  • 从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt
  • Hue面试内容整理-后端框架
  • C++11异步编程 --- async
  • 多目应用:三目相机在汽车智能驾驶领域的应用与技术创新
  • Generative Diffusion Prior for Unified Image Restoration and Enhancement论文阅读
  • Kafka原理深度剖析
  • 【大模型LLM学习】MiniCPM的注意力机制学习
  • LVS+keepalived实战案例
  • 2025-05-13 表征学习
  • Datawhale 5月llm-universe 第1次笔记
  • 从Aurora 架构看数据库计算存储分离架构
  • ArcGIS、InVEST与RUSLE在水土流失模拟及分析中的实践技术
  • C# 高级编程:Expression表达式
  • 记录vsCode连接gitee并实现项目拉取和上传
  • 力扣Hot100(Java版本)
  • 如何学习VBA_3.3.3 VBA程序写好后,如何进行调试,直到程序运行
  • 力扣-543.二叉树的直径
  • 每周靶点分享:Nectin-4、CDH6及文献分享
  • 网络协议分析 实验四 ICMPv4与ICMPv6
  • 紫光同创FPGA实现AD7606数据采集转UDP网络传输,提供PDS工程源码和技术支持和QT上位机
  • 根据输入的数据渲染柱形图
  • 分布式异步强化学习框架训练32B大模型:INTELLECT-2
  • React Native 与 Expo
  • 迅龙3号基于兆讯MH22D3适配CST328多点触摸驱动开发笔记
  • 分别在windows和linux上使用curl,有啥区别?
  • INT202 Complexity of Algroithms 算法的复杂度 Pt.7 NP-Completeness NP完全性
  • JuiceFS v1.3-beta1:新增 Python SDK,特定场景性能 3 倍于 FUSE
  • XA协议和Tcc
  • Vue3+Vite单页面应用(SPA)改造为多页面应用(MPA)