Es gibt keine Möglichkeit, genau das zu erreichen. Tatsächlich machen Member-Funktionen hier keinen Unterschied: Es gibt keine Möglichkeit, eine gewöhnliche Funktion zu deklarieren, die einen Zeiger auf ihren eigenen Funktionstyp zurückgibt. Die Deklaration wäre unendlich rekursiv.
Im Falle einer normalen Funktion können Sie den Typ void (*)()
als "universellen" Funktionszeigertyp verwenden (genau wie void *
wird oft für Datentypen verwendet). Für Mitgliedsfunktionszeiger wäre das void (A::*)()
Typ. Sie müssen reinterpret_cast
für diesen Zweck verwenden. Diese Verwendung (eine Round-Trip-Konvertierung) ist jedoch diejenige, bei der das Verhalten von reinterpret_cast
definiert ist.
Natürlich werden Sie gezwungen sein, Umwandlungen zu verwenden, um den Zeiger zu und von diesem Typ zu konvertieren. AFAIK, gibt es elegante Template-basierte Lösungen mit einem temporären Template-Zwischenobjekt, das das Casting übernimmt.
Sie können auch einen Blick auf diese GotW entry werfen.
P.S. Beachten Sie, dass die Verwendung des Typs void *
als Zwischentyp für Funktionszeiger von der Sprache verboten ist. Während eine solche illegale Verwendung mit gewöhnlichen Funktionszeigern zu funktionieren scheint, hat sie absolut keine Chance, mit Mitgliedsfunktionszeigern zu arbeiten. Mitgliedsfunktionszeiger sind normalerweise nicht-triviale Objekte mit einer Größe, die größer ist als die Größe von void *
Zeiger.
Ich würde gerne Gebrauch 'mem_fun_ref' sagen, aber ich kann nicht sehen, wie. Gute Frage. – wheaties
nicht schon wieder ... Warum wollen alle das machen? Ich habe noch nie etwas gebraucht, das so nah wäre. –
@David: Ich bin bei dir dabei. Ich erinnere mich daran, Member-Pointer _once_ in 15 Jahren Programmierung in C++ zu verwenden. – sbi