2016-03-23 9 views
1

Ich habe einen Vektor shared_ptr, ich möchte Boost shared_ptr kombinieren und zusammen binden.Verwendung find_if und boost :: bind mit einer Reihe von shared_pointers

Meine Frage ist sehr ähnlich this, mit der Ausnahme, dass anstelle von „& MyClass :: ReferenceFn“ Ich mag würde „& Element :: Fn“ nennen.

ist hier ein ähnliches Stück Code:

typedef boost::shared_ptr<Vertex> vertex_ptr; 
std::set<vertex_ptr> vertices; 

void B::convert() 
{ 
... 
if(std::find_if(boost::make_indirect_iterator(vertices.begin()), 
       boost::make_indirect_iterator(vertices.end()), boost::bind(&Vertex::id, boost::ref(*this), _1) == (*it)->id()) == vertices.end()) 
} 

hier ist der Fehler:

no matching function for call to ‘bind(<unresolved overloaded function type>, const boost::reference_wrapper<B>, boost::arg<1>&)’ 

HINWEIS: Ich bin begrenzt die C++ 03 verwenden.

+0

Welchen Fehler bekommen Sie? –

+0

@PiotrSkotnicki, der Fehler ist, dass es (dieses Schlüsselwort) als dieser Zeiger der Klasse B –

+2

dann Perpahs Sie wollen, boost :: bind (& Vertex :: id, _1) == (* it) -> id()) ', oder,' boost :: bind (statischer_cast (& Vertex :: id), _1) == (* it) -> id()) '(wobei' int' ist der Rückgabetyp von "id") –

Antwort

2

Um für jedes Objekt in einer Sammlung gespeichert, um eine Member-Funktion aufrufen, benötigen Sie einen Platzhalter als die erste gebundene Argument der boost::bind verwenden:

boost::bind(&Vertex::id, _1) == (*it)->id()) 
//      ~^~ 

diese Weise wird jedes Argument a, wird gebunden sein ein Mitgliedsfunktionszeiger und wird als (a.*&Vertex::id)() aufgerufen.

Wenn Sie jedoch sehen, dass die Fehlermeldung unresolved overloaded function type lautet, wird daraus geschlossen, dass Ihre Klasse Vertex mehrere Überladungen der Elementfunktion id haben kann. Daher kann der Compiler nicht sagen, welcher als Argument von boost::bind übergeben werden soll. Um dies zu lösen, eine explizite Umwandlung zu einem Mitglied Funktionszeiger verwenden (das Sternchen nach Doppelpunkt zeigt an, es ist ein Zeiger auf ein Mitglied):

boost::bind(static_cast<int(Vertex::*)()const>(&Vertex::id), _1) == (*it)->id()) 
//      ~~~~~~~~~~~~~~~~~~~~^ 

Im Fall Klasse Vertex mehr Überlastungen haben, sagen:

int id() const { return 0; } 
void id(int i) { } 

verwenden Sie die erste für die Bindung.