Re[2]: Мультиметоды и С++
От: yaroslav_v http://yaroslav-v.chat.ru
Дата: 25.07.03 11:45
Оценка: 52 (8)
WR>Вот ещё одна возможная реализация мультиметодов на C++:
WR>#define DEF_ID(n)\
WR>    enum ID {ID = n};\
WR>    virtual int GetID()\
WR>    {    return ID;    };

WR>// Коллекция классов:
WR>struct GObject
WR>{
WR>    DEF_ID(0)
WR>    virtual ~GObject(){};

WR>};


Можно для определения типа использовать такой трюк (я его придумал пару лет назад,
мы его давно включили в нашу библиотеку):

#define DEF_ID()\
 virtual int GetID() const { return classtype(); } \
 static int classtype() { return (int)classtype; }

// преобразование к (int) можно не делать если GetID бы возвращал "const void*",
// так в общем и надо делать - тут я просто сделал упрощение

struct GObject
{
  DEF_ID();
  virtual ~GObject(){};
};


Т.е. не надо каждый раз придумывать константы — в качестве уникального идентификатора класса
используется адрес статической функции, который вычисляется автоматически.

Казалось бы, что в принципе якобы linker может все функции слить в одну,
но на самом деле не может, т.к. например по Строустропу (гл.13), что адрес глобального объекта
обьявленый как "extern" может использоваться как аргумент шаблона.
Словом тут linker ничего поделать не может и для каждого класса генерирует
разные функции, и таким образом получается автоматическая идентифичация класса.
Кстати, а почему бы "typeid()" не использовать — я то его не использовал из-за того, что
RTTI все имена классов в *.exe файл лепит, а это не очень хорошо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.