Ich habe eine ganze Zahl N, die ich zur Kompilierzeit kenne. Ich habe auch eine Std :: Array Halte Ganzzahlen beschreiben die Form eines N-dimensionalen Array. Ich möchte geschachtelte Schleifen, wie unten beschrieben, zur Kompilierzeit unter Verwendung von Metaprogrammierungstechniken erzeugen.So generieren Sie verschachtelte Schleifen zur Kompilierzeit
constexpr int N {4};
constexpr std::array<int, N> shape {{1,3,5,2}};
auto f = [/* accept object which uses coords */] (auto... coords) {
// do sth with coords
};
// This is what I want to generate.
for(int i = 0; i < shape[0]; i++) {
for(int j = 0; j < shape[1]; j++) {
for(int k = 0; k < shape[2]; k++) {
for(int l = 0; l < shape[3]; l++) {
f(i,j,k,l) // object is modified via the lambda function.
}
}
}
}
Hinweis der Parameter N wird zum Zeitpunkt der Kompilierung bekannt, aber möglicherweise unvorhersehbar zwischen Compilations ändern, daher kann ich nicht hart codiert die wie oben Schleifen. Im Idealfall wird der Schleifenerzeugungsmechanismus eine Schnittstelle bereitstellen, die die Lambda-Funktion akzeptiert, die Schleifen erzeugt und die Funktion aufruft, die den äquivalenten Code wie oben erzeugt. Mir ist bewusst, dass man zur Laufzeit eine äquivalente Schleife mit einer einzelnen while-Schleife und einem Array von Indizes schreiben kann, und es gibt bereits Antworten auf diese Frage. Ich bin jedoch nicht an dieser Lösung interessiert. Ich bin auch nicht an Lösungen interessiert, die Präprozessormagie beinhalten.
Ist das nicht der Compiler Entrollen der Schleifen, wenn Optimierung ist eingeschaltet? – Arunmu
Er könnte sehr gut einige Schleifen ausrollen, aber das ist nicht der Punkt. Ich frage nach Loop-Generierung nicht Schleife abrollen. Jedenfalls kann das Array Werte enthalten, die viel größer sind als die oben angegebenen Ganzzahlen. Ein vollständiges Abwickeln der Loops ist nicht möglich. –
Verwenden Sie eine einzelne Schleife und berechnen Sie 'i',' j', 'k' und' l' usw. aus dem Index der einzelnen Schleifen. –