2010-11-23 4 views
3

Ich habe Klasse mit Funktionen:std :: eine Member-Funktion auf einen Objektzeiger binden

typedef std::function<bool (const std::string &)> InsertFunction;  

bool insertSourceFile(const std::string &); 
bool insertSourceDir(const std::string &); 
bool insertHeaderFile(const std::string &); 
bool insertHeaderDir(const std::string &); 

Ich möchte einen Verweis auf eine dieser InsertFunction s in einer anderen Klasse haben, und es verwenden, um mach seinen Job (ohne für jede dieser Funktionen Klassen zu machen). Ich versuchte, den Klassenkonstruktors und std::bind unter Verwendung der Mitgliedsfunktion der implizite erstes Argument einen Zeiger des Objekts in Frage zu binden:

new ListParser(p_target->sourceDirs(), bind(&Target::insertSourceFile, p_target, _1), this); 

mit

ListParser::ListParser(const stringSet &dirs, const InsertFunction &insert, 
         State* parent = 0) 
: ParserState(parent), 
    m_dirs(dirs), 
    m_insert(insert) 
{ } 

UPDATE: Danke, @lijie der Quelle kompiliert jetzt, aber wenn die Funktion m_insert aufgerufen wird, wird std::exception für std::bad_function_call ausgelöst. Was könnte falsch sein? Vielen Dank! Wenn Sie mehr Informationen benötigen, fragen Sie bitte!

Antwort

2

In Ihrem Code ist insertSourceFile eine Methode, die eine std::function<etc> zurückgibt. In Ihrem Bindungsaufruf tun Sie Target::insertSourceFile(), die die Methode aufruft. Daher der Fehler.

EDIT Insbesondere Ziel :: insertSourceFile ist keine Funktion, die einen String und gibt einen Booleschen nimmt.

Ich denke, was Sie suchen ist in Target erklären Sie bool insertSourceFile(const std::string &);, usw. und dann tun Sie std::bind(&Target::insertSourceFile, p_target, _1) aber das ist eine Vermutung, bis die Absicht geklärt ist.

+0

Danke, ich habe die Frage mit korrigierter Syntax aktualisiert. Ich möchte tatsächlich m_insert als eine Funktion verwenden, die eine 'const std :: string &' nimmt und ein 'bool' zurückgibt, und diese Funktion ist diejenige in' p_target' (daher die Bindung). – rubenvb

+0

Egal, ich habe einen const-Verweis auf das Funktionsobjekt gespeichert, das von 'bind' als temporär erstellt wurde, was auf eine seltsame Weise zu einem leeren Funktionsobjekt führte. Es funktioniert jetzt und ruft die richtige Funktion auf! Danke noch einmal! – rubenvb

Verwandte Themen