通过索引实现“constexpr for”

2023-12-14

for (int i = 0; i < 5; ++i) {
    std::get<i>(tuple);
}

这不会编译,因为i不是编译时间常数。在如何迭代 std::tuple 的元素?和其他帖子我看到递归的答案,或使用std::apply,但那些失去了索引控制。我也不想仅仅限制自己std::tuple.


每当我必须在编译时循环某些内容时,我都必须停下来思考并做一些奇怪的事情,特别是当我尝试实现非标准迭代(例如反向、自定义增量)或在同一语句中涉及多个索引时,例如std::get<i>(tuple) * std::get<i + 1>(tuple).


with c++20我们能得到的最接近的是什么constexpr for (int i = 0; i < 5; ++i)?


可以制作一个constexpr_for<N>(F&& function)使用的实现std::index_sequence扩大Size as 0, 1, ... N - 1到模板化的 lambda 上,它使用std::integral_constant范围。该参数隐式地将结构体的模板参数转换为size_t通过其constexpr operator value_type() const noexcept;操作员。

#include <utility>
#include <type_traits>

template<size_t Size, typename F>
constexpr void constexpr_for(F&& function) {
    auto unfold = [&]<size_t... Ints>(std::index_sequence<Ints...>) {
        (std::forward<F>(function)(std::integral_constant<size_t, Ints>{}), ...);
    };

    unfold(std::make_index_sequence<Size>());
}

这使得std::get<i>行为:

auto tuple = std::make_tuple(0ull, 1, 2.0, "3", '4');
constexpr size_t size = std::tuple_size_v<decltype(tuple)>;

constexpr_for<size>([&](auto i) {
    std::cout << std::get<i>(tuple) << ' ';
});
//prints 0 1 2 3 4

[&]捕获可以访问size因此可以实现反向迭代:

constexpr_for<size>([&](auto i) {
    std::cout << std::get<size - i - 1>(tuple) << ' ';
});
//prints 4 3 2 1 0

或例如通过检查越界尝试来迭代奇数索引:

constexpr_for<size>([&](auto i) {
    constexpr auto idx = (i * 2 + 1);
    if constexpr (idx < size) {
        std::cout << std::get<idx>(tuple) << ' ';
    }
});
//prints 1 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过索引实现“constexpr for” 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • jasypt-spring-boot-1.17:属性解密失败,请确保加密/解密密码匹配

    我有 jasypt spring boot 1 17 带有 spring 版本 4 2 5 RELEASE 和 spring Boot 版本 1 5 3 RELEASE 我正在使用该网站的第一种方法 https github com uli
  • JavaScript 中同一行的多个比较/赋值运算符

    function test input var value input 1 在上面 函数内部的代码行在做什么以及它是如何工作的 首先是进行比较input 1 然后分配其结果 这将是true or false 变量value The is a
  • 如何自定义 HTML5 日期选择器

    我试图了解如何以特定方式自定义 HTML5 日期选择器 特别是格式类似于 日历图标 8 月 31 日 星期二右侧插入符号将打开日期选择器 经过一些初步搜索后 我找到了这些用于自定义日期输入文本框的伪元素 webkit datetime ed
  • c++ - FreeImage+OpenCV - 16 位图像扭曲

    我正在尝试加载图像 因为我必须对其应用算法 如果我加载每通道 8 位图像 则没有问题 但如果我加载 16bpc 图像 则会 毁掉 不幸的是 由于我没有足够的声誉 我无法上传图像 这些是它们的链接 源和 8bpc 处理结果 http post
  • 了解为什么 onCreateOptionsMenu 不显示菜单

    我正在阅读 Android For Dummies 一个例子使用了 onCreateOptionsMenu 我添加了一条日志消息 Override public boolean onCreateOptionsMenu Menu menu s
  • 字典递归比较程序

    我创建了一个程序来比较两个 python 字典并输出两者的差异 它适用于深度为 2 或更小的字典 我应该怎么做才能处理更深度的字典以及嵌套的字典 我遇到的另一个问题是 当我通过 get json 函数传递 json 数组时 它会作为列表返回
  • 使用 DirectShow 过滤器进行编码

    我正在努力将原始图像编码为 Windows 上的 avi 文件 可能使用 directshow 过滤器 使用的编解码器类型将由用户选择 我已经使用 Windows 视频 VFW 做了类似的事情 这很漂亮 因为它提供了简单的 api 来压缩数
  • 使用子进程时如何在 Python 中复制 tee 行为?

    我正在寻找一个 Python 解决方案 它允许我将命令的输出保存在文件中 而不将其从控制台隐藏 仅供参考 我问的是tee 作为 Unix 命令行实用程序 而不是 Python intertools 模块中的同名函数 Details Pyth
  • 展示 SkScene 中的另一个视图控制器

    我正在尝试展示另一个viewController来自我的 SkScene 这是我的主要viewController tuViewController Code void openTweetSheet FacebookLikeViewDemo
  • 打开拨号盘以拨打用户想要的号码

    我想在用户单击通话按钮时打开拨号盘 然后用户输入电话号码并拨打它 我知道我们可以这样打电话 UIApplication sharedApplication openURL NSURL URLWithString telprompt 2135
  • 如何在 Markdown pandoc 中打破长头线?

    在这个降价代码中 This a very long line header which was written in markdown 我想将长行分成两行 但保持标题的样式 这是错误的意图 This a very long line hea
  • 如何在 Ruby 中使用 mechanize 填写登录表单?

    下面是我希望用机械化填写的表格 已经尝试过常用的模型 例如 使用 Ruby 和 Mechanize 填写远程登录表单之谜 但没有成功
  • 如何使用链接按钮打开新选项卡?

    我正在使用一个linkbutton在一个gridview控件 我想将数据打开到新选项卡中 我尝试设置target blank 但它不起作用 我尝试过这样做 这是我的源代码
  • WCF 用户名身份验证:我可以在自定义 ServiceAuthorizationManager 中获取用户名吗?

    我有一个使用自定义的 WCF 服务ServiceAuthorizationManager 自定义身份验证管理器已设置为处理 Windows 和表单身份验证 但是 如果我连接的客户端设置为UserNameauth 我似乎无法在任何地方找到用户
  • 在一个类中使用带有成员函数的通用 std::function 对象

    对于一个类 我想将一些指向同一类的成员函数的函数指针存储在一个类中map储存std function对象 但我一开始就失败了这段代码 include
  • Clojure 生产者 消费者

    我正在学习 clojure 并通过生产者消费者示例尝试其并发性和有效性 这样做后 不得不使用 ref 和 deref 以及观察和取消观察感觉非常尴尬 我尝试检查其他代码片段 但是除了使用 Java Condition await 和 sig
  • 单击表格,更新行,将鼠标悬停在行上,更新表格

    我是 D3 的新手 但到目前为止我很喜欢它 但我知道我的解决方案缺乏 优雅 我试图有 2 个控件 一个表格和一个显示表格单元格表示的数据的图表 如果单击表格上的单元格 则相关行应突出显示 如果将鼠标悬停在一行上 关联的表格单元格将改变颜色
  • 如何忽略或修复重复的类警告?

    我正在尝试使用Qulice代码质量控制工具 当我跑步时qulice check在我的项目中 我收到以下错误 WARNING Found duplicate and different classes in junit junit 4 8 2
  • 如何获取对象的实例名称

    我使用下面的代码编写代码来查询指定时间间隔内的Web方法 现在在 this Poll 函数中我必须做 this tmo setTimeout this strInstanceName Poll this iInterval 代替 this
  • 通过索引实现“constexpr for”

    for int i 0 i lt 5 i std get i tuple 这不会编译 因为i不是编译时间常数 在如何迭代 std tuple 的元素 和其他帖子我看到递归的答案 或使用std apply 但那些失去了索引控制 我也不想仅仅限