Dieses Programm:
#include
#include
struct Nobody_Expects_The_Spanish_Inquisition {
};
namespace junk {
struct I_didnt_expect_a_kind_of_spanish_inquisition
: public Nobody_Expects_The_Spanish_Inquisition
{
};
}
int main(int argc, const char *argv[])
{
using ::std::type_info;
using ::std::cout;
Nobody_Expects_The_Spanish_Inquisition foo;
junk::I_didnt_expect_a_kind_of_spanish_inquisition bar;
const type_info &fooinfo = typeid(foo);
const type_info &barinfo = typeid(bar);
cout << "Der Typ von foo ist <" << fooinfo.name() << ">\n";
cout << "Der Typ von bar ist <" << barinfo.name() << ">\n";
return 0;
}
hat diese Ausgabe:
$ ./foo
Der Typ von foo ist <38Nobody_Expects_The_Spanish_Inquisition>
Der Typ von bar ist
Dies ist so gut wie es für Reflexionen in C++ wird. Und das reicht gerade aus, um das zu erreichen, was der Standard-Terminierungshandler tut.
Während der Standard-Terminierungshandler, wie andere schon angemerkt haben, sowieso das Ziel auf seine Weise erreichen darf, würde es mich überraschen, wenn er nicht die gleichen Mechanismen nutzen würde, die für die Implementierung von typeid
verwendet werden, um dies zu ermöglichen.
Natürlich könnte der Standard-Terminierungshandler arbeiten, indem er auf einen speziellen Bereich zugreift, den der Compiler erstellt, wann immer eine Ausnahme geworfen wird, der aufzeichnet, was der Compiler über den Namen des Typs weiß, an der Stelle, an der sie geworfen wird. Wie andere angemerkt haben, ist der Standard-Terminierungshandler vom Compiler dort platziert und nicht an die Regeln gebunden, denen der von einem C++-Programmierer geschriebene Code folgen müsste.
Ich habe Leute gesehen, die ihre eigenen Terminierungshandler schreiben, die den Aufrufstapel manuell durchgehen und Debug-Symbole zu jeder Adresse nachschlagen, um eine Art Stack-Trace zu erhalten. Dies sind Compiler- und plattformspezifische Magie, und da der Compiler genau weiß, welcher Compiler es ist und auf welcher Plattform er verwendet wird, könnte er einen Standard-Terminierungshandler haben, der dasselbe auf unterstützten Plattformen tut.
Zusammenfassend: RTTI ist nicht erforderlich, um das von Ihnen festgestellte Feature zu implementieren. Aber RTTI ist eine sehr rudimentäre Form der Reflexion und könnte verwendet werden, um dieses Feature zu implementieren.