TypInfoGetEnumName (C++)

From RAD Studio Code Examples
Jump to: navigation, search

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