So drucken Funktion Mitglied Adresse in C++
Sieht es aus wie std::cout
kann nicht drucken, Mitglied, Funktion, Anschrift, zum Beispiel:
#include <iostream>
using std::cout;
using std::endl;
class TestClass
{
void MyFunc(void);
public:
void PrintMyFuncAddress(void);
};
void TestClass::MyFunc(void)
{
return;
}
void TestClass::PrintMyFuncAddress(void)
{
printf("%p\n", &TestClass::MyFunc);
cout << &TestClass::MyFunc << endl;
}
int main(void)
{
TestClass a;
a.PrintMyFuncAddress();
return EXIT_SUCCESS;
}
das Ergebnis ist so etwas wie dieses:
003111DB
1
Wie kann ich drucken Sie MyFunc
's Adresse mit std::cout
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass es irgendwelche Einrichtungen durch die Sprache, dies zu tun. Es gibt überladungen für
operator <<
für streams ausdrucken normalenvoid*
Zeiger, aber die member-Funktion-Zeiger sind nicht konvertierbarvoid*
s. Dies alles ist von der Implementierung abhängig, aber in der Regel-member-Funktion-Zeiger implementiert sind, als ein paar Werte, - ein flag, das angibt, ob oder nicht die member-Funktion virtuell ist, und einige zusätzliche Daten. Wenn die Funktion ist eine nicht-virtuelle Funktion, die zusätzlichen Informationen ist in der Regel die eigentliche Memberfunktion die Adresse. Wenn die function ist eine virtuelle Funktion, die zusätzlichen Informationen, die wahrscheinlich enthält Daten darüber, wie Sie einen index in die virtuelle Funktion Tabelle finden Sie die Funktion aufrufen, angesichts der receiver-Objekt.Im Allgemeinen, ich denke, das bedeutet, dass es unmöglich ist, drucken die Adressen der member-Funktionen aufrufen, ohne Undefiniertes Verhalten. Würde Sie wahrscheinlich verwenden einige compiler-spezifischen trick, um diesen Effekt zu erzielen.
Hoffe, das hilft!
Ich würde gerne noch die anderen Antworten, dass der Grund, dass Sie immer '1' statt gedruckt eine Adresse, ist, dass aus irgendeinem Grund, den compiler ist die Nötigung Ihrer Funktion Zeiger auf einen booleschen Wert, so dass Sie wirklich anrufen
ostream& operator<< (bool val);
Diese scheint unabhängig von der Funktion als Mitglied Funktion.
Können Sie entdecken, diese Art von Informationen mit dem clang++ -cc1 -ast-dump:
Einen Weg, das zu tun, (ich bin nicht sicher, es ist tragbar) :
Beispiel : http://ideone.com/1SmjW
reinterpret_cast
die in der Regel nur interpretiert das Gedächtnis als Ziel geben. In diesem Fall wird es mit dem erstensizeof(void*)
bytes gespeichert in Zeiger auf member, als ob es war einvoid*
, aber wenn man sich mal die Größen der beiden Typen, die Sie werden sehen, dass Sie sich unterscheiden (Zeiger, um Mitglied zu werden, ist größer).Zeiger auf member-Funktionen Arbeitsspeicher benötigen, zu. Sie haben auch eine Größe. So wie etwa das drucken aus der Speicher für den Zeiger:
Können Sie es auf diese Weise: