c++17 有效地将参数包参数与 std::array 元素相乘

2024-04-22

我想有效地将​​参数包中的参数与 std::array 的元素相乘:

int index(auto... Is, std::array<int,sizeof...(Is)> strides)
{
  // pseudo-code
  // int idx = 0;
  // for(int i = 0; i < sizeof...(Is); ++i)
  //   idx += Is[i] * strides[i];
  // return idx; 
}

我无法完全理解这一点。我开始走索引序列的道路,但我可以弄清楚如何合并求和。

我使用的是 c++17,因此如果折叠表达式能够简化代码,那么它们是公平的游戏。

感谢您的指点。

编辑:澄清伪代码。唯一的伪部分是表达式Is[i]它指的是第 i 个参数包参数。

T.C. 下面的答案是完美的,这是我的最终代码,它是一个成员函数:

unsigned int index(auto... indexes)
{
    unsigned int idx = 0, i = 0;
    (..., (idx += indexes * m_strides[i++]));
    return idx;
}

截至撰写本文时,代码使用带有 -fconcepts 标志的 gcc 6.3.0 进行编译,该标志引入了 Concept TS。

Using auto... indexes是简写template<typename Args> f(Args... indexes)。我尝试使用 unsigned int 概念作为参数,但我无法让它发挥作用。

(...,) 折叠是关键元素,并扩展为类似的内容(如果您实际上可以 [] 进入参数包):

idx += indexes[0] * m_strides[i++], idx += indexes[1] * m_strides[i++], etc.

这就是我所缺少的洞察力。


我无法得到auto...为了工作,所以我改变了签名index.

您将需要一个辅助功能(index_helper此处)使用index_sequence,因为它依赖模板参数推导来填充索引。

#include <array>
#include <cstdio>

template <typename... T, size_t... i>
//                       ^~~~~~~~~~~
//                        use deduction to make {i...} = {0, 1, 2, ..., n}
static int index_helper(const std::array<int, sizeof...(T)>& strides,
                        std::index_sequence<i...>,
                        T... Is) 
{
    return (0 + ... + (strides[i] * Is));
}

template <typename... T>
int index(const std::array<int, sizeof...(T)>& strides, T... Is) {
    return index_helper(strides, std::make_index_sequence<sizeof...(T)>(), Is...);
//                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//                                generates {0, 1, 2, ..., n}
}

int main() {
    printf("%d\n", index({1, 100, 100000, 1000}, 2, 3, 5, 7));
    // 507302
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++17 有效地将参数包参数与 std::array 元素相乘 的相关文章

  • 在单个 C# 泛型方法中返回可为 null 和 null?

    C 泛型方法是否可以返回对象类型或 Nullable 类型 例如 如果我有一个安全的索引访问器List我想返回一个值 稍后我可以使用以下任一方法检查该值 null or HasValue 目前我有以下两种方法 static T SafeGe
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • 如何正确实现带有 close 方法的处置模式(CA1063)

    框架设计指南 第二版 第 327 页 说 考虑提供方法Close 除了Dispose 如果接近 是该领域的标准术语 这样做时 重要的是使 Close 实现与Dispose并考虑实施IDisposable Dispose方法明确 因此 按照提
  • 为什么数组不可赋值? [复制]

    这个问题在这里已经有答案了 据我所知 C 标准禁止使用数组作为可修改的左值 即在赋值的左侧 int lhs 4 rhs 4 0 1 2 3 lhs rhs illegal 现在 我一直想知道为什么会这样 我可以看到上面的语句 以及写入数组的
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 获取进程的所有 DLL

    我想获取为给定进程加载的所有 dll 的列表 我目前正在使用 NET框架4 0 我知道有一个bug https connect microsoft com VisualStudio feedback details 546430 syste
  • 为什么这段代码不会产生编译错误?

    template
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • vs2010 c++ 通过debug查看指针内容

    我正在使用 Vs2010 c 处理 2D 数组 我从一维指针开始 并使用操作 如下 class CMatrix void clear public int nRows int nCols short MyMat CMatrix CMatri
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • Sharepoint 的 CAML 查询中的日期时间比较

    我正在尝试从共享点列表中获取某些项目 具体取决于自定义列中的日期 我已经使用 U2U Caml Builder 创建了查询 这很有效 但是当我将其放入 Web 部件中自己的代码中时 它总是返回列表中的所有项目 这是我的代码 DateTime
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 通过开源 PCL 使用 API 查看 3D 点云

    我使用 ToF 飞行时间 相机来获取 XYZ 格式的深度数据 为了实现 3D 点云的可视化目的 我想使用开源 PCL 提供的 API 网址为http pointclouds org documentation tutorials pcl v
  • 如何正确对齐 WPF GeometryGroup 中的路径?

    我正在使用一个GeometryGroup在圆的中心绘制一个符号 下面的示例显示了我在对此进行实验时的尝试之一 它具有从同一原点 32 32 出发的三条直线
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 在 C# 中设置风扇速度

    我知道以前有人问过这个问题 但我似乎无法让它发挥作用 我已调用以下内容 using System Management using System Management Instrumentation using System Runtime
  • Eclipse (C/C++) 错误:平台关闭后发现作业仍在运行

    当我打开 Eclipse 时 它 在一小时前工作过 但在启动时冻结并给出错误 发生错误 请参阅日志文件 请参阅下面的日志文件 尽管其中一些信息出现在日志中 操作系统 Mac OSX 10 7 5 Eclipse 面向 C C 开发人员的 E

随机推荐

  • ui-router deferIntercept 和状态参数

    我使用 ui router 的新 deferIntercept 来更新浏览器 url 而无需重新加载 我的控制器 rootScope on locationChangeSuccess function e newUrl oldUrl e p
  • Python AST 中的 ExtSlice 节点表示什么语法?

    我正在费力地浏览Pythonast模块并且无法弄清楚切片定义 slice Ellipsis Slice expr lower expr upper expr step ExtSlice slice dims Index expr value
  • Pandas 读取 Excel 并跳过带删除线的单元格

    我必须处理一些xlsx从外部来源收到 有没有更直接的方法来加载xlsx in pandas同时还用删除线跳过行 目前我必须做这样的事情 import pandas as pd openpyxl working file r somethin
  • 哪些分类器提供权重向量?

    存在哪些机器学习分类器可以在学习阶段后提供权重向量 我了解 SVM 逻辑回归 感知器和 LDA 还有更多吗 我的目标是使用这些权重向量绘制重要性图 其实任何线性分类器 https en wikipedia org title Linear
  • UITableView - 字母表

    这是我希望添加到带有字母表的 UITableView 中的改进 如果我的表中没有不以字母表字母开头的结果 我不想在 UITableView 中看到此 titleForHeaderInSection 我找不到这样做的方法 您可以查看我当前的实
  • 如何将 XML 转换为字符串而不使用 .NET 中的文件?

    假设我有两个字符串 一种是XML数据 另一个是XSL数据 如果您必须知道的话 xml 和 xsl 数据存储在数据库列中 如何在 C 中转换 XML 而不先将 xml 和 xsl 保存为文件 我也希望输出是一个字符串 来自转换的 HTML 看
  • Scala REPL 中的类型信息

    如果我使用 F 解释器 我可以定义一个简单的函数 如下所示 gt Function to check if x is an integer multiple of y gt let multipleOf x y x y 0 val mult
  • 如何从不在 Spring 容器中的类访问 Spring Bean 的方法

    我不是一个Spring https spring io 亲 所以请耐心等待 我有三门课 class SpringBeanA public aMethod class SpringBeanB Autowired SpringBeanA a p
  • 响应式 adsense 广告单元检查其 div

    根据 Google 的说法 响应式广告根据所提供空间的宽度和高度动态填充可用空间 我们根据广告单元 父容器的宽度动态计算所需的尺寸 然后确定与该宽度相匹配的最佳标准高度 我将响应式 Adsense 单元放置在宽度值为 774px 的 div
  • 将git管理的子目录切换到子模块

    我们曾经在Rails应用程序中对delayed job进行了本地破解 位于vendor plugins delayed job中 它作为一次性事件安装并签入主应用程序存储库中的 git 现在我们决定在 github 上分叉 Delayed
  • java从当前目录读取文件

    我有一个 java 项目 我正在其中读取文件 由于该文件位于当前目录中 我正在这样做 String dataset myFile dat 但我得到 java io FileNotFoundException说找不到该文件 如何解决这个问题
  • 如何开发 Eclipse 搜索插件?

    我想开发一个插件视图 它将自动调用Eclipse中的搜索插件并显示包中调用特定函数的所有位置 帮我 我该怎么办 谢谢 这是另一个很好的插件开发教程http www vogella de articles EclipsePlugIn arti
  • matplotlib savefig() 大小控制

    我编写了一个函数 它采用 Pandas 生成的数据帧并生成热图 def drawHeatMap df city province collector classtype color titleposy try thePlot pl mats
  • TinyMCE 和 Laravel

    我正在尝试在我的 Laravel 项目中使用tinyMCE 问题是当我存储新文章时 html 标签不起作用 它们像纯文本一样显示在我的 laravel 视图上 这是在create blade php中实现的代码
  • cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员

    I have Windows 7 32 位上的 cygwin 1 7 25 g 版本 gt g GCC 4 8 2 libstdc a gt gcc g 4 8 2 1 试图制作一个c 你好世界 include
  • React Context API - 在页面刷新时保留数据

    假设我们设置了一个上下文提供程序以及一些初始数据属性值 在此过程中 假设消费者随后修改了这些属性 页面重新加载时 这些更改将丢失 保存数据以便我们可以保留这些数据修改的最佳方法是什么 除了本地存储之外还有其他方法吗 是的 如果您希望数据在重
  • 为什么需要在 createToken 方法中传递一个字符串?

    为了在 Laravel Sanctum 中创建访问令牌 需要在createToken方法 我觉得这很奇怪 因为您传入的任何内容都会使用 SHA 256 进行哈希处理 或者您可以获取纯文本令牌 为什么访问令牌不是基于随机字符串创建的 它可以很
  • 从非 UI 线程更新 Windows 窗体上的标签?

    我已经尝试了 2 天来做到这一点 我查看了大量的 stackoverflow 答案并尝试了所有答案 但仍然遇到同样的问题 我在 Windows 窗体上有一个标签 此 Windows 窗体上的唯一代码是 var thread1 new Thr
  • PowerShell参数值建议

    我用 C 编写了一个 Cmdlet 是否可以为特定字符串参数提供所有可能的值 此示例为 PackageId public sealed class InstallPackageCommand PSCmdlet Parameter Posit
  • c++17 有效地将参数包参数与 std::array 元素相乘

    我想有效地将 参数包中的参数与 std array 的元素相乘 int index auto Is std array