Als Teil des Hashing muss ich einen Funktionszeiger in eine Zeichenfolgendarstellung konvertieren. Mit globalen / statischen Funktionen ist es trivial:
%Vor%Und von hier :
2) Jeder Zeiger kann in einen beliebigen integralen Typ konvertiert werden, der groß genug ist, um Halte den Wert des Zeigers (z. B. in
std::uintptr_t
)
Aber ich habe Probleme mit Mitgliedsfunktionen:
%Vor% gibt 1
aus, obwohl ich im Debugger die Adresse sehen kann.
Gibt einen Kompilierungsfehler cannot convert
. Es scheint also, dass kein Zeiger konvertiert werden kann.
Was kann ich noch tun, um eine String-Darstellung zu erhalten?
%Vor%gibt
1
aus, obwohl ich im Debugger die Adresse sehen kann.
Es gibt keine Überladung für ostream::operator<<(decltype(&MyStruct::member))
. Der Elementfunktionszeiger ist jedoch implizit in bool
konvertierbar, und daher gibt es eine Überladung, die am besten zur Überladungsauflösung passt. Der konvertierte Wert ist true
, wenn der Zeiger nicht null ist. true
wird als 1
ausgegeben.
%Vor%Gibt einen Fehler bei der Kompilierung, der nicht konvertiert werden kann. Es scheint also, dass kein Zeiger konvertiert werden kann.
Vielleicht ist verwirrenderweise im standardmäßigen -Zeiger kein Überbegriff für Objektzeiger, Zeiger auf Elemente, Zeiger auf Funktionen und Zeiger auf Elementfunktionen. Zeiger bedeuten nur Datenzeiger spezifisch.
Die zitierte Regel gilt also nicht für Zeiger-zu-Stab-Funktionen. Es gilt nur für (Objekt-) Zeiger.
Was kann ich noch tun, um eine String-Darstellung zu erhalten?
Sie können einen Puffer von unsigned char
verwenden, groß genug, um den Zeiger darzustellen, und std::memcpy
verwenden. Dann drucken Sie es in dem Format Ihrer Wahl. Ich empfehle hexadezimal.
Wie Martin Bonner hervorhebt, kann der pointer-to-member Padding enthalten. In diesem Fall haben zwei Werte, die auf dasselbe Element verweisen, möglicherweise einen anderen Wert im Puffer. Daher ist der gedruckte Wert nicht von großem Nutzen, weil zwei Werte nicht vergleichbar sind, ohne zu wissen, welche Bits (wenn überhaupt) padding sind - was die Implementierung ist.
Leider brauche ich eine robuste Lösung, deswegen kann ich diese Padding nicht verwenden.
Es gibt keine portable robuste Lösung.
Wie Jonathan Wakely darauf hinweist, gibt es in Itanium ABI kein Padding. Wenn Ihr Compiler das verwendet, funktioniert die vorgeschlagene memcpy-Methode.
Tags und Links c++ casting function-pointers