我想有效地将参数包中的参数与 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.
这就是我所缺少的洞察力。