将空白*映射回其原始类型
Map a void* back to its original type
我正在为我的程序创建一个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;
}
相关文章:
- 请参阅Watch-Window中的原始类型定义
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 如何调节类模板和原始类型模板
- 如何复制包含非原始类型的阵列
- 原始类型的强类型(BOOST_STRONG_TYPEDEF没有切割)
- c中的neo4j-client,在语句中编码的原始类型(即int)
- 幻影类型是否与原始类型具有相同的对齐方式
- 通过参考传递原始类型是适得其反的吗?
- 统一功能使用模板专业化和接口来调用实例和原始类型
- NDK带有JNI的ndk,使用返回类型的非原始类型调用方法
- 带有原始类型的C++模板
- 将空白*映射回其原始类型
- 有什么方法可以获取llvm顺从指针值的原始类型(即指针类型)
- 避免使用dynamic_cast向下转换为原始类型
- 如何在模板中的类型之间进行转换并转换回原始类型
- 助推.任何获得原始类型
- 区分 C++11 原始类型名称与类型定义名称
- 有没有办法从 boost::any 中获取一个整数,如果您不知道原始类型是有符号的还是无符号的
- 为空指针指定原始类型后删除该指针
- 是否有可能描述某个原始类型的子类型