TypInfoGetEnumName (C++)
Contents
Description
This example demonstrates the methods to retrieve run-time type information (RTTI) using GetEnumName. This example prints useful information about any given type, including its name, size, kind, and subkind.
Code
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
#include <vector>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <System.Generics.Collections.hpp>
/* A template class */
template<class T>
class TGenericClass : public std::vector<T> {
public:
void PrintTypeInfo();
};
template<class T>
void TGenericClass<T>::PrintTypeInfo() {
PTypeInfo Info = new TTypeInfo;
PTypeData Data;
String SubName, KindName;
char tmpBuffer[256];
memset(tmpBuffer, 0, 256);
/* Get type info for the "yet unknown type". */
Info = __delphirtti(T);
/* There is no RTTI attached for some types, such as Records. */
if (Info != NULL) {
strcpy(tmpBuffer, AnsiString(Info->Name).c_str());
printf("Type name: %s\n", tmpBuffer);
/* Find out the name of an enum item from its ordinal value. */
KindName = System::Typinfo::GetEnumName(__delphirtti(TTypeKind),
Info->Kind);
strcpy(tmpBuffer, AnsiString(KindName).c_str());
printf("Type Kind: %s\n", tmpBuffer);
memset(tmpBuffer, 0, 256);
Data = GetTypeData(Info);
if (Info->Kind == tkInteger) {
/* In the case of Integer, here is the actual subtype name */
SubName = System::Typinfo::GetEnumName(__delphirtti(TOrdType),
Data->OrdType);
strcpy(tmpBuffer, AnsiString(SubName).c_str());
printf("Integer kind: %s\n", tmpBuffer);
}
if (Info->Kind == tkFloat) {
/* In the case of Float, here is the actual subtype name. */
SubName = System::Typinfo::GetEnumName(__delphirtti(TFloatType),
Data->FloatType);
strcpy(tmpBuffer, AnsiString(SubName).c_str());
printf("Float kind: %s\n", tmpBuffer);
}
if (Info->Kind == tkDynArray + 1) {
/* Check out the element size. */
printf("Element size: %d\n", Data->elSize);
}
printf("Size of type: %d\n\n", sizeof(T));
}
}
int _tmain(int argc, _TCHAR* argv[]) {
TGenericClass<int> *IntClass = new TGenericClass<int>;
IntClass->PrintTypeInfo();
TGenericClass<double> *DoubleClass = new TGenericClass<double>;
DoubleClass->PrintTypeInfo();
TGenericClass<String> *StringClass = new TGenericClass<String>;
StringClass->PrintTypeInfo();
/* Read a character to see the results. */
getch();
return 0;
}
Uses
- System.TypInfo.PTypeInfo ( fr | de | ja )
- System.TypInfo.PTypeData ( fr | de | ja )
- System.TypInfo.TOrdType ( fr | de | ja )
- System.TypInfo.TFloatType ( fr | de | ja )
- System.TypInfo.GetEnumName ( fr | de | ja )
- System.Generics.Collections.TList ( fr | de | ja )