Ist es möglich, zum Durchlaufen einer mpl::vector zur Laufzeit ohne Instanziierung der Typen, in den Vektor?
Generell würde ich boost::mpl::for_each<>()
durchqueren boost::mpl::vector
, aber dies erfordert einen Funktor mit einer template-Funktion erklärt, wie die folgenden:
template<typename T> void operator()(T&){T::staticCall();}
Mein problem mit diesem ist, dass ich nicht wollen, das Objekt T instanziiert werden durch for_each<>
. Ich brauche nicht den parameter T in der operator()
überhaupt. Gibt es eine Möglichkeit, dies zu erreichen, oder eine alternative zu for_each<>
dass nicht die übergabe eines Objekts vom Typ T an die template-Funktion?
Optimal, ich möchte die operator () - definition wie folgt Aussehen:
template<typename T> void operator()(){T::staticCall();}
Und natürlich will ich nicht, dass T instanziiert werden überhaupt vor dem Anruf. Andere Tipps/Vorschläge sind auch willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Interessante Frage! Soweit ich das beurteilen kann, zu Steigern.MPL scheint nicht zu geben einen solchen Algorithmus. Allerdings schreiben Sie Ihre eigenen, sollte nicht allzu schwierig sein, mit Iteratoren.
Hier ist eine mögliche Lösung:
[Die Namensgebung ist vielleicht nicht besonders gut gewählt, aber gut...]
Hier ist, wie würden Sie die Verwendung dieses Algorithmus:
Gerade erlebt die gleiche situation und, sofern verschiedene Lösung für das problem, das ich gerne teilen möchte. Es ist nicht so, dass offensichtliche, aber es nutzt einen vorhandenen Algorithmus. Die Idee ist die Verwendung von Zeigern statt.
so, hier bekommen wir einen null-Zeiger, aber das ist uns egal, da wir nicht Vorhaben, Sie zu benutzen.
Wie gesagt, dass ist nicht offensichtlich in den code, und würde wahrscheinlich erfordern einige zusätzliche Kommentare, aber es noch löst Sie die Frage ohne das schreiben von zusätzlichem code.
Hinzugefügt
Ich denke Diego Sevilla schlug vor, etwas ähnliches.
mpl::transform
zu definieren, die den "Zeiger" - version on-the-fly:boost::mpl::for_each<boost::mpl::transform<MyTypes, boost::add_pointer<boost::mpl::_1> >::type>(Functor());
Gut, zunächst wird der statische Aufruf im code bedeutet, dass Ihr Objekt existieren. Vorher/nachher ist sinnlos, in dieser Hinsicht. Das einzige mal, "ich will nicht, dass T instanziiert an alle die vor dem Aufruf," sinnvoll ist, wenn T ist eine Vorlage. Es ist nicht, weil es nicht sein kann. Es ist wahr, dass es ist, dass die Linie, die bewirkt, dass das Objekt vorhanden ist, aber ich bin ziemlich sicher, dass es nicht nur dort existieren, sobald das Produkt zusammengestellt.
Zweitens, ich glaube nicht, dass es eine aktuelle Methode for_each ohne instanziieren. IMHO ist dies ein bug in MPL, verursacht durch eine fragwürdige Entscheidung, die operator(). Will nicht sagen, es ist falsch, denn ich kenne den Entwickler und er ist viel klüger, als ich bin, aber es scheint so, aus jetzt hier, dass Sie dies.
So, ich denke, Sie stecken mit remake eine for_each, dass Anrufe auf eine Vorlagen-Funktion, die nicht erforderlich ist, den parameter ein. Ich bin fast sicher, es ist möglich, aber auch ebenso sicher, es ist nicht bereitwillig verfügbar als vorgefertigte Komponente in MPL.
Marcin, du hast sehr Recht. Ich habe mir überlegt, diese entlang und ich sehe nicht, eine einfache Lösung für dieses. Auch wenn Sie nicht schreiben Sie die leeren
operator()
, es wäre zumindest möglich, verwenden Sie einen Zeiger, der das nicht braucht, ein Tatsächliches Objekt zu existieren. Du musst Rollen Sie Ihre eigene Implementierung, wie es scheint.mpl::begin
undmpl::end
. Im Grunde müssen Sie durchqueren, es selbst. Genau wie Sie schreiben, sehr langefor(std::vector<int>::iterator it = v.begin() ...
Dinge für Iteratoren. Schreiben Sie eine Funktion höherer Ordnung, um es zu vereinfachen, aber am Ende müssen Sie noch durchqueren es wie @Luc Touraille vorgeschlagen.Hier ist eine alternative Lösung, sehr inspiriert von Luc Touraille Antwort.
Dieser version erfolgt mit Metafunction Klassen anstelle von Funktionen, die ermöglicht die
static_for_each
genannt zu werden, auch außerhalb der Funktion Bereiche (nützlich, wenn der job muss völlig fertig am compile-Zeit, so dass Sie keine unnötigen Funktionen, die zur Laufzeit aufgerufen).Außerdem gibt es mehr Interaktion Dank der
first
undlast
typedefs, so dass man Informationen aus der Schleife, wenn notwendig, ein wenig wie einreturn
arbeitet für eine Funktion.Können Sie auch Zugriff auf die vorherigen iteration Ergebnis innerhalb jeder iteration mit dem zweiten template-parameter
Previous
an die metafunction KlasseF
.Schließlich können Sie die Daten zur loop-Prozess, der die
Initial
parameter template angegeben, wird als Wert derPrevious
parameter der ersten iteration.Hier ist ein einfaches Beispiel, das beide gibt und ruft Daten :
Diese Eigenschaften macht die Verwendung von
static_for_each
ähnlich wie die Nutzung der gemeinsamen Laufzeit von Schleifen (while
,for
, BOOST_FOREACH ...) wie können Sie interagieren direkt mit der Schleife.mpl::for_each
ist, dass es funktioniert zur Laufzeit (gut, die iteration erfolgt zur compile-Zeit, aber es ruft runtime-Operationen), und ich nahm an, der OP wollte dieses Verhalten. Sonst, er, hätte einen der zahlreichen compile-Zeit-algorithmen zur Verfügung gestellt von MPL.Mochte ich (bis-gestimmt habe) die Lösung mit Zeiger und eigene definiert *_for_each Funktion. Hier ist eine alternative mit type-wrapper für T, wenn das Ziel ist zu vermeiden, Objekterstellung, bis es benötigt wird.