Boost.Bind zum Zugriff auf std :: map Elemente in std :: for_each

8

Ich habe eine Map, die eine einfache Struktur mit einem Schlüssel speichert. Die Struktur hat zwei Mitgliedsfunktionen, die eine ist const die andere nicht. Ich habe geschafft, die const-Funktion mit std :: for_each ohne Probleme aufzurufen, aber ich habe einige Probleme beim Aufruf der nicht-const-Funktion.

%Vor%

Der Aufruf der Funktion const member funktioniert gut, aber Booster intern erwartet irgendwo einen const MyStruct und scheitert daher mit folgendem Kompilierungsfehler in MSVC7.1.

  

boost \ bind \ mem_fn_template.hpp (151): Fehler C2440: 'argument': Konvertierung von 'const MyStruct * __ w64' nach 'MyStruct * const'

nicht möglich

Ich würde mich über jede Hilfe bei der korrekten Einstellung der Template-Parameter freuen, damit bind die Parameter korrekt erkennt und ich die non const-Funktion aufrufen kann.

danke, Carl

    
Carl 22.02.2010, 15:09
quelle

4 Antworten

8

IIRC, Boost.Bind verwendet boost::mem_fn für die Bindung an Members. Wenn Sie sich nun mem_fun ansehen (scrollen Sie nach unten zum // data member support -Teil) ), sehen Sie, dass es typedefs seinen Ergebnistyp als const & amp; festlegt, während es immer noch Überladungen des Funktionsaufrufoperators gibt, der die Extraktion eines nichtkonstanten Mitglieds aus einem nichtkonstanten Argument unterstützt.

Es scheint also, dass das Problem darin besteht, dass dies den Rückgabetyp-Abzugsmechanismus von Boost.Bind verwechselt. Eine Lösung wäre also, Bind explizit mitzuteilen, dass das Ergebnis nicht const ist:

%Vor%     
Éric Malenfant 22.02.2010, 16:19
quelle
7

Wenn Sie das häufig tun müssen, empfehle ich Ihnen, die Boost.RangeEx-Bibliothek zu verwenden:

%Vor%

Es wurde in Boost akzeptiert, aber es kommt noch nicht mit der offiziellen Distribution. Bis dahin können Sie herunterladen von der Boost Vault (Download-Link in Zip-Datei).

    
Manuel 22.02.2010 15:45
quelle
4

Wenn Sie bereits auf Boost angewiesen sind, sind Sie möglicherweise bereit, Boost zu überprüfen Foreach

%Vor%

Sehr viel lesbar, obwohl ich über Leistungsprobleme nicht weiß.

Beachten Sie auch, dass Sie Vorlagen nicht innerhalb des Makros verwenden können, ohne das Zeichen , zu "entkommen":

  • entweder von einem typedef vor
  • oder indem Sie ein zweites Klammerpaar um den Typ
  • verwenden
Matthieu M. 22.02.2010 15:35
quelle
0

Ein Problem, das ich entdeckt habe: Die zweite Bindung wird für ein Member ohne Funktion aufgerufen. Zweitens ist ein Datenelement, keine Methode von std :: pair

    
Cătălin Pitiș 22.02.2010 15:18
quelle

Tags und Links