Ich versuche, eine Möglichkeit zu erstellen, mehrere Parameterpakete direkt zu erweitern. Ich habe eine Funktion template<size_t X,typename F> auto sequenceFunc(F&& f)
erstellt, die eine gegebene Funktion f
mit einem erweiterten integer_sequence
aufruft.C++: Erweiterung des Parameterpakets in Lambda schlägt fehl
Das funktioniert gut für kleine Funktionen wie folgt aus:
template<typename T,
size_t A,size_t B>
vec<B,T> col(const mat<A,B,T>& a,const size_t& i){
return sequenceFunc<A>([&](auto... J) -> vec<B,T>{
return { a[J][i]... }; //expands to a[0][i], a[1][i], ... a[A-1][i]
});
}
Leider erweitern Ich kann nicht mehrere Parameter Packs, auch wenn ich die Regel folgen, dass nur ein Parameter Pack ...
-Ausdrucks in einem sein kann. Dies ist mein Versuch, diese Funktion für die Matrixmultiplikation bei Verwendung:
template<typename S,typename T,
size_t A,size_t B,size_t C>
mat<C,B,S> mul(const mat<A,B,S>& a,const mat<C,A,T>& b){
return sequenceFunc<B>([&](auto... I)->mat<C,B,S>{ //for all B rows in a...
return {
sequenceFunc<C>([&](auto... J)->vec<C,S>{ // ... look at all C columns in b and calculate dot product.
auto i = I; //putting "I" outside the expansion of "J"
return {
dot(row(a,i),col(b,J))... //expands J
};
})... //expands I
};
});
}
Dies ist der Fehler:
error: parameter packs not expanded with '...':
auto i = I;
^
Ich verstehe nicht wirklich, warum eine Erweiterung notwendig ist, weil es eine andere ist ...
außerhalb der Ausdruck. Ich benutze GCC 5.1.0.
Informationenvec
und mat
sind nur using
-declarations für std::array
und eine verschachtelte std::array<std::array<A,T>,B>
GCC hat Probleme mit Packs in Lambdas. –
@ T.C. Bugzilla-Link? – Mgetz