На очередной итерации переписывания собственного биндинга C++/Lua возникла проблема владения наследуемых обьектов.
template <class T> class shared_ptr;
class LuaReference;
class wrapper {
LuaReference m_self;
template <...> call(name,...) { call_lua_fucntion( m_self, name, ... );
};
class Base {
virtual void foo() {}
};
typedef shared_ptr<Base> BasePtr;
class Base_wrapper : public Base, public wrapper {
virtual void foo() { call("foo"); }
};
struct lua_storage {
BasePtr ptr;
};
На Lua стороне соответсвенно инстанс наследника — табличка, содержащая среди всего в семе поле "__native" с юзердата хранящим lua_storage
Суть проблемы: контроль времени жизни Lua объекта, сейчас получается перекрестные ссылки
возможные состояния:
1) обьект только на Lua стороне — управление стандартными средствами lua GC. Base_wrapper не должен держать обьект
2) обьект удерживается в С коде, сам он держит Lua часть от сборки через LuaReference m_self
Как красиво решить данную проблему не правя реализацию shared_ptr ?

ситуация в которой обьект может быть уничтожен

переход между состояниями может произойти банальным weak_ref.lock(). на C стороне (клиенский код) ничего незнает о lua составляющей. ручное управление владением ala adopt policy из luabind даром ненужно
сейчас видится решение контролировать количество сильных ссылок на Base_wrapper.
увеличивается >1 — локаем LuaReference, уменьшается до 1 — убиваем LuaRef.
но без хака в shared_ptr я не вижу возможности это сделать.