Re: PImpl и сравнение: возможно ли без RTTI ?
От: c-smile Канада http://terrainformatica.com
Дата: 05.08.09 05:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пусть есть базовый класс реализации


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>() ) 
  ...
Re[6]: PImpl и сравнение: возможно ли без RTTI ?
От: Кодт Россия  
Дата: 05.08.09 08:07
Оценка:
Здравствуйте, Erop, Вы писали:

К>>Под досом в large модели жили же как-то?

E>А разве там можнобыло сравнить два укащателя на разные сегменты и состоящие только из смещения...
E>По идее, если можешь указатели разыменовать, то можешь и сравнить...

Там была другая проблема: ложно-неравные указатели (поскольку селектор — это тоже смещение, только умноженное на 16).
Это вообще проблема любых сегментных моделей памяти, когда одна и та же физическая страница отображена в несколько разных сегментов.
Лечится с помощью вычисления плоского физического адреса

А конкретно в large модели — просто договаривались пользоваться far* вместо near* (последние — для tiny и small).
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[2]: PImpl и сравнение: возможно ли без RTTI ?
От: труженик села  
Дата: 06.08.09 06:12
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:


АШ>А вы обяжите потомков Impl_base возвращать хеш (например, md5) вычисленный по состоянию объекта:

АШ>и сравнивайте уже его:

Если у двух совершенно разных объектов окажется одинаковый хеш, замучаетесь бороться с багами.
Всё же хеш не предназначен для однозначного сравнения объектов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.