我正在为我的程序创建一个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;
}