将空白*映射回其原始类型



我正在为我的程序创建一个Lua api。我希望能够执行以下操作:

void* CreateA()
{
     A* a = new A();
     PointerTypes[a] = A;
     return reinterpret_cast<void*>(a);
}
void* CreateB()
{
     B* b = new B();
     PointerTypes[b] = B;
     return reinterpret_cast<void*(b);
}
void DeleteThing( void* p )
{
     typename type = PointerTypes[p];
     type* t = reinterpret_cast< type >( p );
     delete t;
}

有什么直接的方法可以做到这一点吗?PS:我的应用程序已经使用了RTTI,所以也可以在这里使用。

与其将类型保存在映射中(这是不可能的,因为类型不是C++中的第一类对象),不如在映射中存储删除器函数。然后,您的工厂函数将变为:

void* CreateA()
{
    A *a = new A();
    PointerDeleters[a] = [](void *obj) { delete static_cast<A*>(obj); };
    return a;
}

或使用函数模板:

template<typename T>
void* Create() // maybe you want to forward c'tor args using variadic template
{
    T *a = new T();
    PointerDeleters[t] = [](void *obj) { delete static_cast<T*>(obj); };
    return t;
}

然后调用它以触发删除未知类型的对象p

void DeleteThing(void* p)
{
    PointerDeleters[p]();
}

然后,地图PointerDeleters的值类型应为 std::function<void(void*)>

更好的解决方案是(如果您的设计允许的话)将基类与虚拟析构函数一起使用;然后您可以简单地删除指向该类的指针,而无需存储任何其他信息:

template<typename T>
BaseClass* Create()
{
    return new T();
}
void DeleteThing(BaseClass* p)
{
    delete p;
}

最新更新