Эта программа:
#include <typeinfo>
#include <iostream>
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 << "The type of foo is <" << fooinfo.name() << ">\n";
cout << "The type of bar is <" << barinfo.name() << ">\n";
return 0;
}
имеет такой вывод:
$ ./foo
The type of foo is <38Nobody_Expects_The_Spanish_Inquisition>
The type of bar is <N4junk44I_didnt_expect_a_kind_of_spanish_inquisitionE>
Это так же хорошо, как и самоанализ в C ++. И этого едва хватает для выполнения того, что делает обработчик завершения по умолчанию.
Хотя, как отмечали другие, обработчику завершения по умолчанию разрешено достигать этой цели в любом случае, если это чертовски хорошо, пожалуйста, я был бы удивлен, если бы он не использовал те же механизмы, которые используются для реализации typeid
чтобы сделать эту работу.
Конечно, обработчик завершения по умолчанию может работать, получая доступ к специальной области, создаваемой компилятором всякий раз, когда генерируется исключение, которое записывает все, что знает компилятор об имени типа в том месте, где он генерируется. Как уже отмечали другие, обработчик завершения по умолчанию помещается туда компилятором и не связан никаким кодом правил, написанным программистом C ++.
Я видел, как люди пишут свои собственные обработчики терминалов, которые вручную обходят стек вызовов и символы отладки поиска, связанные с каждым адресом, чтобы получить некоторое факсимиле трассировки стека. Это магия, специфичная для компилятора и платформы, и поскольку компилятор точно знает, какой это компилятор и на какой платформе он используется, он может иметь обработчик завершения по умолчанию, который делал то же самое на поддерживаемой платформе.
Таким образом, RTTI не требуется для реализации функции, которую вы отмечаете. Но RTTI - очень элементарная форма отражения, и ее можно использовать для реализации этой функции.