Здравствуйте, Аноним, Вы писали:
А>Пусть есть базовый класс реализации
RTTI на скорую руку:
class object
{
public:
virtual uint_ptr type_id() const { return 0; }
template <typename OT>
bool is_of_class() const { return type_id() == OT::class_id(); } }
};
template <typename T>
class make_rtti : object
{
public:
static uint_ptr class_id() { return (uint_ptr)(object<T>::class_id); }
virtual uint_ptr type_id() const { return class_id(); }
};
Имея таку байду и скажем классы:
class ClassA : public make_rtti<ClassA> // CRTP - http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
{
....
}
class ClassB : public make_rtti<ClassB>
{
....
}
можем насоздавать обектов типа:
object *pobj = new ClassA();
и у них интересоваться
if( pobj->is_of_class<ClassA>() )
...
else if( pobj->is_of_class<ClassB>() )
...
Здравствуйте, Erop, Вы писали:
К>>Под досом в large модели жили же как-то?
E>А разве там можнобыло сравнить два укащателя на разные сегменты и состоящие только из смещения...
E>По идее, если можешь указатели разыменовать, то можешь и сравнить...
Там была другая проблема: ложно-неравные указатели (поскольку селектор — это тоже смещение, только умноженное на 16).
Это вообще проблема любых сегментных моделей памяти, когда одна и та же физическая страница отображена в несколько разных сегментов.
Лечится с помощью вычисления плоского физического адреса
А конкретно в large модели — просто договаривались пользоваться far* вместо near* (последние — для tiny и small).
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>