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 wie std::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.
InformationsquelleAutor Carl | 2010-02-22
Schreibe einen Kommentar