2016-08-02 11 views
1

Gegeben eine hana::tuple Angabe der Form einer N-dimensionalen Box (z. B. (2,3,2) in 3D) zur Kompilierzeit, ich möchte ein Tupel von Tupeln mit allen Koordinatenkombinationen zur Kompilierzeit erzeugen. (0,0,0) (0,0,1) (0,1,0) (0,1,1) (0,2,0) (0,2,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1) (1,2,0) (1,2,1) Koordinatenerzeugung zur Kompilierungszeit

Die Frage zu einem anderen in Beziehung steht ich vor ein paar Tagen geschrieben (link), aber für hana umformuliert. Ich habe Schwierigkeiten, einen Algorithmus zu finden, der die Unveränderlichkeit des Objekts berücksichtigt. Ich kann nicht erkennen, welche Kombination von hana Algorithmen mir erlauben wird, einen rekursiven Aufruf zu generieren und die zurückgegebenen Tupel gleichzeitig zu sammeln.

+1

Benötigen Sie die Koordinaten selbst, um zur Kompilierzeit verfügbar zu sein (um z. B. eine Vorlage mit ihnen zu instanziieren)? Was versuchst du zu erreichen? Wenn Sie nur versuchen, eine Schleife zu optimieren, tun Sie es nicht. Verwenden Sie ein 'std :: array' mit normalen Loops und der Optimizer wird seine Aufgabe erfüllen. Andernfalls verwenden Sie 'hana :: cartesian_product'. –

+0

Ich brauche die Koordinaten zur Kompilierzeit, um eine Vorlage zu instanziieren. Aber die Vorlage wird nur benötigt, weil ich getan habe, was Sie erraten haben - manuelle Entrollen einer verschachtelten Schleife. Zuerst habe ich meinen Algorithmus mit 'std :: array' implementiert. Ich war mir jedoch nicht sicher, wie sehr ich dem Compiler vertrauen sollte. Aus diesem Grund habe ich versucht, eine andere Version mittels Meta-Programmierung zu implementieren und zu überprüfen, ob es einen signifikanten Leistungsvorteil gibt. –

Antwort

1

Pro Kommentar, Sie haben nur versucht, Loop Enrolling durchzuführen. Vielleicht möchten Sie beide Möglichkeiten messen, aber normalerweise wird der Compiler immens bessere Arbeit leisten als Sie bei der Optimierung dieser Dinge, wenn die Array-Grenzen bekannt sind. Sie können Ihr Programm tatsächlich erheblich verlangsamen oder aufblähen, indem Sie Schleifenausrollen erzwingen.

aber sagte, dass wenn es das ist, was Sie hier tun wollen ist, wie Sie es tun können:

#include <boost/hana.hpp> 
namespace hana = boost::hana; 

template <int ...> struct your_template { }; 

int main() { 
    auto xs = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9] 
    auto ys = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9] 
    auto zs = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9] 

    auto coords = hana::cartesian_product(hana::make_tuple(xs, ys, zs)); 
    hana::for_each(coords, hana::fuse([](auto x, auto y, auto z) { 
     your_template<decltype(x)::value, decltype(y)::value, decltype(z)::value> foo; 
     (void)foo; 
    })); 
} 

jedoch weiß, dass das kartesische Produkt zu erzeugen zur Compile-Zeit ziemlich böse ist, wie Sie erzeuge ein riesiges Tupel. Das oben genannte dauert zum Beispiel etwa 10 Sekunden, um auf meiner Box zu kompilieren.