Возможно ли в нижеследующем коде полностью обойтись
без макросов и сохранить ту же компактность?
Что-то вроде попытки реализовать аналог TObject
из Delphi средствами только препроцессора и C++,
не используя компиляторо-зависимый typeinfo.
#define DEFINE_STRING(value) #value
// default class declaration opening macro
#define BeginClass(name) \
class T##name##Class: public TMetaClass {}; \
T##name##Class T##name##MetaClass; \
class T##name; \
typedef T##name* P##name; \
class T##name \
{ \
public: static char* AncestorName() { return ""; } \
public: static int InheritsFrom(const char* AClassName) \
{ if (ClassNameIs(AClassName)) return 1; else return (strlen(AClassName)==0); }
// single inheritance descedant class declaration opening macro
#define InheritClass(name,access,ancestor) \
class T##name##Class: public TMetaClass {}; \
T##name##Class T##name##MetaClass; \
typedef T##ancestor T##name##Ancestor; \
class T##name; \
typedef T##name* P##name; \
class T##name: access T##ancestor \
{ \
typedef T##ancestor TAncestor; \
public: static char* AncestorName() { return DEFINE_STRING(T##ancestor); } \
public: static int InheritsFrom(const char* AClassName) \
{ if (ClassNameIs(AClassName)) return TRUE; else return T##ancestor::InheritsFrom(AClassName); }
// Delphi-style keyword macro
#define inherited TAncestor::
#define Inherited TAncestor::
#define INHERITED TAncestor::
// default class declaration closing macro
#define EndClass(name) \
public: static unsigned long InstanceSize() { return sizeof(T##name); } \
public: static char* ClassName() { return DEFINE_STRING(T##name); } \
public: static int ClassNameIs(const char* AClassName) \
{ return (strcmp(AClassName,ClassName())==0); } \
public: static PMetaClass ClassOf() { return &T##name##MetaClass; } \
public: static int ClassIs(const PMetaClass AClass) { return (AClass==(PMetaClass)&T##name##MetaClass); } \
};
добавлена раскраска — Кодт