I chcą efektywnie pomnażać argumenty z pakietem parametrów z elementami std :: tablicy:C++ 17 skutecznie mnożyć argumenty parametr pack z elementów tablicy std ::
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;
}
nie mogę dość otoczyłem mój mózg wokół tego. Zacząłem od sekwencji indeksowania, ale mogłem wymyślić, jak włączyć sumowanie.
Używam C++ 17, więc wyrazy są fair fair, jeśli uprościłoby kod.
Dzięki za wszelkie wskazówki.
EDYCJA: Skorygowano pseudokod. Jedyną pseudo częścią jest wyrażenie Is[i]
, które odnosi się do argumentu i'th parametru pack.
odpowiedź TC poniżej była idealna, a tu jest mój ostateczny kod, który jest funkcją członkiem:
unsigned int index(auto... indexes)
{
unsigned int idx = 0, i = 0;
(..., (idx += indexes * m_strides[i++]));
return idx;
}
W chwili pisania tego, kod kompiluje używając gcc 6.3.0 z -fconcepts flagą, która wprowadza koncepcję TS.
Stosowanie auto... indexes
jest skrótem dla template<typename Args> f(Args... indexes)
. Próbowałem użyć niepodpisanego pojęcia int dla argumentów, ale nie mogłem zmusić tego do działania.
The (...) rozkładana jest kluczowym elementem i rozszerza się na coś podobnego (jeśli faktycznie mogła [] do plecaka parametru):
idx += indexes[0] * m_strides[i++], idx += indexes[1] * m_strides[i++], etc.
To był wgląd mi brakuje.
Jestem ciekaw co kompilator używasz. – ThomasMcLeod
@ThomasMcLeod gcc 6.3.0 - ma składanie wyrażeń i kilka innych funkcji C++ 17. – RandomBits
@ThomasMcLeod GCC 7 ma ukończone C++ 17 (nie jest to jednak libstdC++) –