如何在C ++ Builder中编写等效的Delphi“ is”和“ as”?

时间:2018-10-08 07:32:53

标签: c++builder

我想编写一个函数(如果可能的话,甚至是一个运算符),该函数的作用类似于Delphi的“ is”。 Delphi示例:

 if Sender is TMenuItem then 
   TMenuItem(Sender)->Enabled = false;

因此,在C ++ Builder 中,它类似于:

bool Is(*p1, *p2)
{
    p = dynamic_cast<p1*>(p2);      //here we typecast TObject to TMenuItem
    if (!!p)
    {
        return true;
    }
    else return false;
}

如何使函数接受p1,p2的任何类型的对象?

1 个答案:

答案 0 :(得分:3)

问:如何使函数接受p1,p2的任何类型的对象?

A:使用模板,如下所示:

template<typename T, typename PtrType>
bool IsA(PtrType *ptr)
{
    return dynamic_cast<T*>(ptr) != nullptr;
}

使用这样的模板化函数:

A* obj = new C();
if (IsA<C>(obj))
{
        std::cout << "obj is of type C";
}

话虽如此,我建议您避免创建此函数的原因有两个:

  1. 您可以只使用dynamic_cast eveywhere,它更加惯用并向您显示进行这种支票的费用
  2. 检查特定类型通常表示设计有缺陷。在某些情况下需要使用它,但这种情况很少见,总的来说,我个人的看法是,一般不应宽恕它,这种功能会这样做。