我想有效地從參數包與一個std ::數組的元素相乘的參數:C++ 17有效地乘以參數包參數與標準::陣列元件
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個參數包參數。
TC的下面的答案是完美的,這是我最後的代碼是一個成員函數:
unsigned int index(auto... indexes)
{
unsigned int idx = 0, i = 0;
(..., (idx += indexes * m_strides[i++]));
return idx;
}
在撰寫本文時,代碼編譯使用gcc 6.3.0與-fconcepts標誌,帶來概念TS。
使用auto... indexes
是template<typename Args> f(Args... indexes)
的簡寫。我試圖爲參數使用unsigned int概念,但是我無法讓它工作。
的(...)折是關鍵要素,擴展到類似的信息(如果你能真正[]進入參數包):
idx += indexes[0] * m_strides[i++], idx += indexes[1] * m_strides[i++], etc.
那是我缺少的洞察力。
我很好奇,你所使用的編譯器。 – ThomasMcLeod
@ThomasMcLeod gcc 6.3.0 - 具有摺疊表達式和一些其他C++ 17功能。 – RandomBits
@ThomasMcLeod GCC 7是C++ 17完成的(不是libstdC++雖然) –