Возможно ли обойтись без макросов?
От: Nexie  
Дата: 27.03.07 20:02
Оценка:
Возможно ли в нижеследующем коде полностью обойтись
без макросов и сохранить ту же компактность?
Что-то вроде попытки реализовать аналог 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); } \
};

добавлена раскраска — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.