Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将空心*映射回其原始类型_C++_Casting_Rtti - Fatal编程技术网

C++ 将空心*映射回其原始类型

C++ 将空心*映射回其原始类型,c++,casting,rtti,C++,Casting,Rtti,我正在为我的程序创建一个luaapi。 我希望能够做到以下几点: 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*(

我正在为我的程序创建一个luaapi。 我希望能够做到以下几点:

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;
}
void*CreateA()
{
A*A=新的A();
指针类型[a]=a;
返回重新解释(a);
}
void*CreateB()
{
B*B=新的B();
指针类型[b]=b;
返回重新解释(p);
删除t;
}
有什么简单的方法可以做到这一点吗?
PS:我的应用程序已经使用RTTI,所以它也可以在这里使用。

您可以在映射中存储一个deleter函数,而不是将类型保存在映射中(这是不可能的,因为类型不是C++中的第一类对象)。然后,您的工厂功能变为:

void* CreateA()
{
    A *a = new A();
    PointerDeleters[a] = [](void *obj) { delete static_cast<A*>(obj); };
    return a;
}
映射
PointerDeleters
应具有值类型
std::function

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

template<typename T>
BaseClass* Create()
{
    return new T();
}

void DeleteThing(BaseClass* p)
{
    delete p;
}
模板
基类*Create()
{
返回新的T();
}
void DeleteThing(基类*p)
{
删除p;
}

简单地说,没有。一旦你扔掉了类型信息,你就无法取回它。因此,任何解决方案都需要将类型信息存储在某个地方。有什么理由不使用公共基类吗?(如果你想使用现有的类型,你就不能改变这种情况…@leems我使用的类型是完全不相关的。它们是组件。有些只是简单的int*,而有些是类,为了向lua公开它们,我使用lightuserdata(void*)。因此,使用公共基类将非常耗时。如果您正在与Lua进行接口,有什么理由不使用LuaBind吗?例如@vines出于简单的原因,我想向Lua公开一个C风格的API(它是为了供编程新手使用,而C风格的API更容易理解),LuaBind的其他特性不值得,因为它增加了对boost的依赖(即使很难,也可以部分避免)。这正是我想要的!一个棘手的问题是:为什么要使用
static\u cast
而不是
reinterpret\u cast
?请看这里:他们允许在C++11中使用它,但它仍然被认为更危险,因为您可能会意外地做更多有害的事情。我更喜欢
static\u cast
除非我必须使用
reinterpret\u cast
@akaltar此解决方案非常类似于实际的虚拟方法调用实现,因此我会认真考虑重构代码以适应可用的方法,@vines我受LuaAPI的约束,如果不在我的代码中到处引入其他不需要的代码和依赖项,我看不到任何更好的方法来做到这一点。这是一个核心系统,它将影响整个代码库,所以我将继续讨论这个问题。
void DeleteThing(void* p)
{
    PointerDeleters[p]();
}
template<typename T>
BaseClass* Create()
{
    return new T();
}

void DeleteThing(BaseClass* p)
{
    delete p;
}