我有各种各样的小组件结构,具有截然不同的签名,数据等。
struct A,struct B,struct C。
通常,我希望每个人都有一个使用模板释放这些类型的系统类:
static void Free(Component<T>* c)
{
if (c)
{
staticDataPool->Free(c);
}
}
这些对应于使用类型A,B和C的模板创建的池。
我想要做的是从DestroyableComponent中派生出一些,以便在调用Free()时。所有DestroyableComponents都有一个名为Destroy()的虚函数。
static void Free(DestroyableComponent* d)
{
if (d)
{
d->Destroy();
staticDataPool->Free(d);
}
}
最后,如果该类派生自DestroyableComponent,则它会调用Free()的第二个版本,如果它不是它调用vanilla Free()。
如果没有所有组件结构必须从某些东西派生出来,有没有办法做到这一点?
答案 0 :(得分:0)
Free(Component<T>* c)
{
DestroyableComponent* p = dynamic_cast<DestroyableComponent>(c);
if(p == NULL) //p is not destroyable
{
//free static stuff
}
else
{
//free destroyable stuff
}
}
我还要补充说运行时类型转换(RTTI)很慢,所以我会认真考虑你的设计。如果我需要检测在堆上分配的对象,我会为类重载new和delete,并添加bool destroyable。如果delete看到该对象是可销毁的,则取消分配。否则,它什么都不做。
答案 1 :(得分:0)
void MaybeDestroy(DestroyableComponent* d) { d->Destroy(); }
void MaybeDestroy(...) {}
void Free(Component<T>* c)
{
if (c)
{
MaybeDestroy(c);
staticDataPool->Free(c);
}
}
如果Component<T>
继承自DestroyableComponent
,则MaybeDestroy
的第一次重载是更好的匹配。如果另一个不从DestroyableComponent
继承,则另一个将用作后备。