PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionspointer C++


instinct
2009-05-31, 18:04:44
Angenommen ich muss einer Funktion als Übergabeparameter einen Funktionspointer liefern:
int atexit(void (void)* __func);

Jetzt würde ich der Funktion gern eine Methode eines Objektes übergeben, allerdings stimmt dann die Signatur logischerweise nicht.
error: cannot convert ‘void (Object::*)()’ to ‘void (*)()’ for argument ‘1’ to ‘int atexit(void (*)())’

Gibt es eine Möglichkeit trotzdem irgendwie meine Methode zu übergeben?

kloffy
2009-05-31, 18:29:45
Die einfachste Lösung wäre die Methode als "static" zu deklarieren. Wenn das nicht akzeptabel ist bleibt noch so etwas:

std::list<boost::function<void()> > actions;
void atexit_helper()
{
for(std::list<boost::function<void()> >::iterator i(actions.begin()), j(actions.end()); i!=j; ++i) (*i)();
}

struct X
{
void foo() { std::cout << "bar" << std::endl; }
};

int main()
{
X* x = new X();
actions.push_back(boost::bind(&X::foo, x));
atexit(atexit_helper);
exit(0);
}

Neomi
2009-05-31, 18:35:24
Eine nichtstatische Methode einer Klasse benötigt den impliziten this-Pointer als Parameter. Du kannst also höchstens eine statische Methode (nicht objektgebunden) übergeben und den Pointer auf dein Objekt (falls benötigt) global hinterlegen, in dem Fall würde deine statische Methode einfach den Aufruf an das hinterlegte Objekt weiterleiten, wäre also ein Wrapper. Nicht elegant, aber bei parameterlosen (nichtmal ein void* zum durchreichen, bäh) Funktionspointern geht es nicht wirklich besser.

instinct
2009-05-31, 19:13:08
Danke für die schnellen Antworten. Ich habe nun einen anderen Weg gefunden, mit dem ich die Funktionspointer umgehen kann, da die Lösungen nicht wirklich schön sind.