Re: замена VPTR это "грязный" хак?
От: Seigram  
Дата: 06.04.11 19:06
Оценка:
Здравствуйте, Аноним, Вы писали:
[skipped]

Вообще-то это я писал, забыл авторизироваться.
1. Не ожидал такого обилия ответов и советов
2. Многие просто не захотели заметить что я категорически НЕ могу шевелить кучу.
И плодить инстанции реализаций тоже не могу заранее.
Поэтому иду на это колдунство.
Собственно никаких конструкторов и деструкторов, тем более нетривиальных — нет.
Сейчас решение в упрощенном виде(если отбросить что все являются шаблонными классами)
приблизительно такое(собственно машина состояний и событий, но без монстроидальных switch's):


template <class T> class Interface
    : public T
{
public:
  template <class Q> void as() {
    new ((void*)this)Q();
  }
  template <class Q> void as() const {
    new ((void*)this)Q();
  }
  inline T* operator-> () { return this; }
  inline T const* operator-> () const { return this; }
};

template <class Q, class T> void as(T *ptr) {
  new ((void*)ptr)Q();
}

struct Intf { // на самом деле здесь template <int _код_группы>
  virtual R1 method1(T1, ...TN) {}
  ...
  virtual Z1 methodZ(Q1, ...QN) {}
};

struct Derived1: public Intf { // на самом деле здесь template <int _код_группы>
  // конкретная реализация
  ...
  ...
  X1 methodX(U1, ...UN) { 
    if (params_depended_condition) { // мутирую самого себя - самый грязный HACK   :) 
      as<DerivedK> (this); 
      return X1(code_X);
    }
  }
  ...
};
...прочие Derived

Где-то где нужно(в отдельной нитке): 
Interface<Intf> intf;
for (;;) {
 // прицеливаемся
 if (cond1) intf.as<Derived1> ();
 else ...
 else if (condN) intf.as<DerivedN> ();
 // используем реализацию
 intf->method<такой-то> (параметры такие-то)
}


Думаю понятно что такой подход мне понравился из-за отсутствия таблицы-таблиц вызовов в которой черт ногу сломит.
Но терзают сомнения — на всех ли компиляторах это прокатит ?..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.