Function pointers ?
-
Hallo,
ich lese gerade Primer und bin gerade über function pointers gestolpert.
*
Programmiere normalerweise in C#
*Ich sehe keine Anwedungsmöglichkeiten für function pointers. Erst dachte ich ok man könnte vielleicht über einen pointer mehrere functions benutzen.
Aber da ist es doch viel angenehmer virtual methods zu benutzen. Vielleicht bin ich auch nur verwirrt.
Benutzt ihr function pointers ? Und wenn ja , wann und warum ?
-
Benutzt du in C# Delegates? Delegates sind im Prinzip nichts Anderes als Function Pointer. Abgesehen davon, programmiert man in C++ nicht unbedingt nur objektorientiert...
-
Na ja, in C++ gibt es tatsächlich wenig Anwendungen für Funktionszeiger. Die kommen ja auch aus der C Ecke. In C hat man dann z.B. so etwas:
void foo(int i, int (*bar) (float f));oder Ähnliches. In C++ kann man das zusätzlich über virtual (kennste ja schon), oder über Templates lösen.
template <typename Functor> void foo(int i, Functor bar);Beide C++ Lösungen haben den Vorteil, dass u.U. noch Objektinformationen mitgegeben werden können. Die Templatelösung hat den Vorteil, wesentlich schneller als die anderen beiden Lösungen sein zu können (die normalerweise etwa gleich schnell sind, je nach dem wie der Compiler optimiert), da das zur Compilezeit aufgelöst wird. Nachteil bei Templates ist halt, dass Fehlermeldungen nicht beim Caller zu finden sind (da erstmal jeder Typ passt), und dass die vollständige Definition zur Compile und nicht erst zur Linkzeit bekannt sein muss. (Deshalb warten wir ja so gespannt auf Module und Concepts, die diese beiden Probleme beheben dürfen. ;))
-> Ja, du hast das irgendwo schon richtig beobachtet. Funktionspointer in C++ Code machen eigentlich eher selten Sinn. (Edit: Quasi nie? Mir fällt gerade jedenfalls nichts ein.)
-
okay danke ihr beiden
-
Oder auch fürs Ausführen von Strings.
#include <iostream> int main() { std::cout << reinterpret_cast<int (*) ()>("\xB8\x2A\x00\x00\x00\xC3")(); }
-
cooky451 schrieb:
-> Ja, du hast das irgendwo schon richtig beobachtet. Funktionspointer in C++ Code machen eigentlich eher selten Sinn. (Edit: Quasi nie? Mir fällt gerade jedenfalls nichts ein.)
Asynchron I/O und da in Verbindung mit std::bind / boost::bind.
Aber ist ja vom Prinzip her auch ein Function Pointer.Oder um z.B. "Signals and Slots" zu realisieren.
Gruessle
-
Eigentlich braucht man in C++ keine function pointer, allerdings sind viele Libraries (z.B. WinAPI) in C geschrieben und da braucht man sie schon.
-
cooky451 schrieb:
...(Edit: Quasi nie? Mir fällt gerade jedenfalls nichts ein.)
Um
std::bindundstd::functionzu implementieren.
-
Aber da ist es doch viel angenehmer virtual methods zu benutzen.
Aber meist ist ein separates Objekt unnoetig.
Benutzt ihr function pointers ? Und wenn ja , wann und warum ?
Ja ich benutzte Funktionszeiger. Beispielsweise um der Sortierfunktion eine eigene Vergleichsfunktion mitzugeben.
-
Tachyon schrieb:
Um
std::bindundstd::functionzu implementieren.
Edit: Moment mal, ne. Sind auch nur Templates, wie in meinem Beispiel. "bar" könnte da auch ein Funktionszeiger sein, aber ich hab's nicht dazu gezählt, da ich es lieber als "irgendetwas Callbares" sehe.
-
cooky451 schrieb:
Tachyon schrieb:
Um
std::bindundstd::functionzu implementieren.
Edit: Moment mal, ne. Sind auch nur Templates, wie in meinem Beispiel. "bar" könnte da auch ein Funktionszeiger sein, aber ich hab's nicht dazu gezählt, da ich es lieber als "irgendetwas Callbares" sehe.
Ich meinte die Interna von
functionundbind. Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.
-
Tachyon schrieb:
Ich meinte die Interna von
functionundbind. Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)
-
Für Callbacks vielleicht?
-
cooky451 schrieb:
Tachyon schrieb:
Ich meinte die Interna von
functionundbind. Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)
Methodenzeiger sind aber keine Funktoren. Die muss
bindalso gesondert behandeln.
bindhat Überladungen für verschiedene Funktionstypen, um zum Beispiel den Rückgabetyp herzuleiten.
-
cooky451 schrieb:
Tachyon schrieb:
Ich meinte die Interna von
functionundbind. Da müssen ja irgendwie Methoden- und Funktionszeiger gespeichert werden.Nope, die speichern einfach nen Typ T. Deswegen funktioniert bind ja auch mit Funktoren und nicht nur mit Funktionen. (Natürlich kann ein konkretes T u.U. ein Funktionszeiger sein, aber erstmal sieht man das nicht.)
Ähm, gibts da nicht Spezialisierungen für alles Mögliche? Zum Beispiel bei bind für freie Funktionen? Wie soll man das ohne Funktionszeiger implementieren?
Oder bei sowas:
void foo(){}... std::function<void ()> functor(&foo);Was soll den std::function da speichern, wenn nicht einen Funktionszeiger?
-
http://ideone.com/fNJ18
blubb
-
Kellerautomat schrieb:
http://ideone.com/fNJ18
blubbFunktioniert bei mir nicht. Ich benutze noch C++2003. Wie machst Du es da? Okay, aber ich sehe, mit C++11 kommt man auch ohne FPs aus. Find ich gut.
-
In C++03 ists halt kein Variadic Template. Ansonsten funktioniert das da genau gleich.
-
Kellerautomat schrieb:
In C++03 ists halt kein Variadic Template. Ansonsten funktioniert das da genau gleich.
Da hast Du auch keine Rvalue-Refs und dementsprechend kein move. Ohne gehts aber nicht, so wie Du es gezeigt hast. Achso, und Dein Teil ist nicht kopierbar, wenn ich das richtig sehe. Aber nicht kopierbare Delegates sind ziemlich doof.
-
Ich war zu faul, kopierbarkeit einzubauen. Bleibt dir als Übung überlassen.