Здравствуйте, Аноним, Вы писали:
[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<такой-то> (параметры такие-то)
}
Думаю понятно что такой подход мне понравился из-за отсутствия таблицы-таблиц вызовов в которой черт ногу сломит.
Но терзают сомнения — на всех ли компиляторах это прокатит ?..