当前 proxy 使用的是 observe 模式,也就是不参与所有权管理。
为了扩展其使用,需要添加所有权的扩展能力,基于目前的实现,有一些改动方案。
方案1:使用 trait 技法,将 storage 参数化
template<typename Storage>
class XXXProxy
{
//GENERATED_BODY
Storage self = nullptr;
const ${record.short_name}_VTable* vtable = nullptr;
/*ctor*/
template<typename T>
${record.short_name}(T& obj) noexcept
: self(&obj)
, vtable(${record.short_name}_VTableTraits<T>::get_vtable())
{
}
//...
这样带来的问题是用户侧需要手动模板化proxy,而优点是 Storage 比较自由
方案2:固定支持 shared 以及 observe 类型
//GENERATED_BODY
variant<void*, shared_ptr<void>> storage;
void* get_self();
const ${record.short_name}_VTable* vtable = nullptr;
需要敲定一下方案以进一步推进此功能
当前 proxy 使用的是 observe 模式,也就是不参与所有权管理。
为了扩展其使用,需要添加所有权的扩展能力,基于目前的实现,有一些改动方案。
方案1:使用 trait 技法,将 storage 参数化
这样带来的问题是用户侧需要手动模板化proxy,而优点是 Storage 比较自由
方案2:固定支持 shared 以及 observe 类型
需要敲定一下方案以进一步推进此功能