[linux-l] C++ callbacks mit libsigc.sourceforge.net ?
Steffen Dettmer
steffen at dett.de
Sa Dez 15 16:51:55 CET 2007
Hi,
ich versuche ja noch so nebenbei par2 zu installieren und bin dabei über
libsigc++ gestolpert.
Dabei wird aus
void clicked(void *data);
register_click_handler(okbutton, clicked, somedata);
über templates was typsicheres gemacht:
"As C++ programmers, we want type safety. We also want to be able to
use things other than free-standing functions as callbacks."
daraus wird dann z.B.
class Detector {
sigc::signal<void> signal_detected;
};
void warn_people();
mydetector.signal_detected.connect( sigc::ptr_fun(warn_people) );
warum macht man das eigentlich? Intuitiv würde man ja
class Detector {
public: class CallBack { public: void detected(void) = 0; }
void setCallBack(CallBack *const callback);
};
{
class myWarnPeople : public Detector::CallBack
{
public: void detected(void)
{
// warn people here
}
};
}
mydetector.setCallback(new myWarnPeople());
oder sowas in der Art (ist jetzt bloss so runtergeschrieben und bestimmt
falsch).
Warum macht man das nicht so im OO Stil, sondern über Funktionen? Könnte
mir etliche Gründe vorstellen (Speichermanagement, oder dass man globale
Funktionen hat oder - aber nur, wenn man das eben nicht über templates
macht - dass man auch C Funktionen aufrufen können will), aber keiner
überzeugt so richtig, finde ich.
Callbacks sind findet man ja oft in GUIs, sozusagen schon immer. Ist das
geschichtlich so gekommen (in C geht ja nichts anderes) und dann einfach
so geblieben? Oder ist der OO Stil nicht so wirklich viel besser (weil
man ja immer noch keine richtigen closures hat)? Interessanterweise
verhalten sich in Java inner classes ja ganz `komisch' (soll heissen,
speziell). Dieses Verhalten passt zu closures. Hängt das damit zusammen,
dass man dachte, in Java will man inner classes dann nur (hauptsächlich)
für sowas verwenden? Mein Beispiel von oben passt ja zu dem
Javaverhalten wie die Faust aufs Auge - oder ist das Zufall?
(Erstaunlich, wieviele Fragen aus sowas entstehen können, was :))
Hat jemand einen Link dazu zur Hand oder etwas in der Art?
oki,
Steffen
--
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.
Mehr Informationen über die Mailingliste linux-l