2012-03-29 10 views
3

ich eine Reihe von Funktionen zu schaffen, die alle effektiv das gleiche tun:Speichern von boost :: bind-Funktionen in einem std :: map

long Foo::check(long retValue, unsigned toCheck, const std::set<unsigned>& s) 
{ 
    auto it = s.find(toCheck); 
    return (it == s.end()) ? -retValue : retValue; 
} 

wo Foo eine Klasse ist. Alles ziemlich einfach. Nun möchte ich effektiv viele Varianten dazu erstellen, aber an verschiedene Sets gebunden. Ich möchte diese dann in einer std :: map speichern. Also, mit boost :: bind und boost :: Funktion, so etwas wie:

void Foo::addToMap(unsigned option, const std::set<unsigned>& currentSet) 
{ 
    someMap[option] = boost::bind(&Foo::check, this, _1, _2, currentSet); 
} 

Das Problem Ich habe versucht, den Typ der Karte zu definieren. Ich dachte, es wäre:

std::map<unsigned, boost::function<long (long, unsigned)> > someMap; 

Aber Kompilieren diese mit MSVC 9.0 gibt: error C2582: 'operator =' function is unavailable in 'boost::function<Signature>'.

Was genau sollte das zweite Vorlageargument sein?

+0

haben Sie versucht, die Menge Argument (binden) in boost :: ref einzuwickeln oder wie auch immer es heißt? Referenzen sind nicht zuweisbar. –

+0

@ Cheersandthth.-Alf Versucht, es mit boost :: cref (currentSet) zu umhüllen, aber das gibt genau den gleichen Fehler. Dasselbe, wenn ich es mit nicht-const übergebe, dasselbe, wenn ich es durch nicht-konstanten Wert überlasse ... – Yuushi

+1

oh, dang. dann versuchen Sie bitte, das Problem in einem minimalen Programm zu reproduzieren, und posten Sie das (vollständiger Code). –

Antwort

0

Ah ich habe es gelöst. Ich habe die falsche Header-Datei eingefügt. Statt:

#include <boost/function.hpp>

ich auch Dinge aus der boost/Funktion Ordner wie:

#include <boost/function/function_fwd.hpp>

0

Mit boost 1.49 und g ++ 4.4.4 konnte ich etwas sehr ähnliches tun. Hier ist ein Codeausschnitt.

typedef boost::function< void (SomeType) > CallbackType; 

std::pair<std::string, CallbackType> NameCallbackPair; 

war ich dann in der Lage sie mit folgendem zuweisen:

NameCallbackPair somePair(someString, boost::bind(&SomeClass::someMethod, this, _1)); 

Vielleicht mit MSVC9 etwas, das es ist.

Verwandte Themen