Boost.Binden auf std::map-Elemente, die in std::for_each
Habe ich eine Karte, welche eine einfache Struktur mit einem Schlüssel. Das struct hat zwei member-Funktionen, eine ist const die anderen nicht. Ich habe es geschafft das aufrufen der const-Funktion mit std::for_each ohne Probleme, aber ich habe einige Probleme mit dem Aufruf der non-const-Funktion.
struct MyStruct {
void someConstFunction() const;
void someFunction();
};
typedef std::map<int, MyStruct> MyMap;
MyMap theMap;
//call the const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1)));
//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1)));
Den Aufruf der const-member-Funktion funktioniert gut, aber es scheint, boost-intern erwartet ein const MyStruct irgendwo, und somit nicht mit den folgenden Kompilierungsfehler in MSVC7.1.
boost\bind\mem_fn_template.hpp(151): error C2440: 'argument' : cannot convert from 'const MyStruct *__w64' in 'MyStruct *const '
Ich würde schätzen jede Hilfe, wie man die template Parameter korrekt, so binden Sie erkennt die Parameter richtig und lassen Sie mich rufen Sie die nicht const-Funktion.
Dank,
Carl
- Wie wäre es, wenn Sie zurück und sagen Sie uns, was Sie wirklich versuchen zu erreichen, hier? Verwendung von for_each mit einer Karte mit boost::bind sinnvoll sein, aber die Chancen stehen ziemlich gut, dass eine andere Allgemeine Ansatz besser funktionieren wird (viele Male diese Art von Frage stellt, ist es, weil
std::for_each
ist eine schlechte Wahl für die situation, und etwas wiestd::copy
oder std::accumulate " würde die Aufgabe viel einfacher). - Die MyStruct wird in einer Art Partikel-system, wo MyStruct ist das Teilchen. Die const-Funktion ist eine draw () - Funktion, die nicht-Konstante Funktion berechnet die neue position. Der Schlüssel in der Karte ist das Datum der Erstellung. Anyway, an dem Punkt habe ich die Frage gepostet, es wurde mehr über wie zu machen, dass Arbeit, als wenn das eine gute design in der Anfang.
Du musst angemeldet sein, um einen Kommentar abzugeben.
IIRC, zu Steigern.Binden verwendet
boost::mem_fn
für die Bindung an die Mitglieder Funktion. Nun, wenn man sich mem_fun (nach unten scrollen, um die//data member support
Teil), wirst du sehen, dass es Typdefinitionen seine result_type als const&, während immer noch hat überlastungen der Funktionsaufruf-operator unterstützt die Extraktion eines non-const-Element aus einer nicht-const argument.Es so scheint, dass das problem ist, dass diese verwirrt zu Steigern.Binden Rückgabetyp Abzug-Mechanismus. Eine Lösung wäre daher, um explizit sagen zu Binden, dass das Ergebnis nicht const:
boost::lamba::bind
kompilieren wird ohne explizite Angabe des Rückgabetyps. Vielleichtboost::lamda::bind
ist schlauer alsboost::bind
in der Aufzucht return-Typen?boost::mem_fn
Wenn Sie finden Sie müssen, dies zu tun eine Menge, die ich empfehle, verwenden Sie die Boost.RangeEx Bibliothek:
Es ist angenommen worden, in Boost, aber es kommt nicht mit der offiziellen distribution noch. Bis es funktioniert, können Sie herunterladen aus der Boost-Vault (download-link zur zip-Datei).
std::for_each
Schleife durchboost::for_each
, aber nicht sagen, wie man verwendenboost::bind
als argument entweder. Auch so, es ist ein workaround.bind
erinnern mich an das Sprichwort zu regulären Ausdrücken: "einige Leute, wenn Sie mit einem problem konfrontiert..."mem_fn
, nicht diefor_each
ändern. Das heißt, mitboost::mem_fn
stattboost::bind
bietet einen workaround, aber das ist völlig orthogonal zu der änderung vonstd::for_each
zuboost::for_each
.boost::adaptors::map_values
Teil? Ich denkeboost::mem_fn
allein nicht helfen, im Fall von verschachtelten bindetWenn Sie bereits abhängig
Boost
Sie möglicherweise bereit, zu prüfen, Boost ForeachVieles lesbar, obwohl ich nicht weiß, über performance-Probleme.
Beachten Sie auch, dass Sie nicht verwenden können Vorlagen eingegeben in das makro ohne "Flucht" der
,
Charakter:Ein problem habe ich entdeckt: die zweite Bindung ist aufgerufen, für eine nicht Funktion Mitglied. der zweite ist ein Datenelement, nicht eine Methode von std::pair