замена VPTR это "грязный" хак?
От: Аноним  
Дата: 03.04.11 20:33
Оценка: :))
Хочу использовать реализации интерфейсов без динамической реаллокации объектов реализующих их,
способ примерно такой:

class Interface {
public:
  virtual void someFun() =0;
};
class Derived1: public Interface {
public:
  void someFun() {
    //реализация...
  }
};
class Derived2: public Interface {
public:
  void someFun() {
    //реализация...
  }
};

class User { // потребитель
public:
  Interface intf;
  template <class T> changeIntfRealization() {
    // возможные проверки на происхождение T от Interface на манер: static_assert(is_base_of<Interface, T>::value, "Ouch");
    new (&intf)T(); // происходит подмена VPTR
  }  
};

int main() {
  User user;
  user.changeIntfRealization<Derived1> ();
  user.intf.someFun(); // вызовется реализация Derived1

  user.changeIntfRealization<Derived2> ();
  user.intf.someFun(); // вызовется реализация Derived2
}


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