TypInfoGetEnumName (C++)

From RAD Studio Code Examples
Jump to: navigation, search

Language:

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

See Also

Personal tools