C ++如果type是派生类型,则调用特定函数

时间:2014-05-01 01:32:52

标签: c++ templates

我有各种各样的小组件结构,具有截然不同的签名,数据等。

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()。

如果没有所有组件结构必须从某些东西派生出来,有没有办法做到这一点?

2 个答案:

答案 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继承,则另一个将用作后备。