如何在 C++ Builder 中编写 Delphi "is" 和 "as" 的等价物?

How to write equivalent of Delphi "is" and "as" in 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 的任何类型的对象?

问:如何让函数接受 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 everywhere,它更加地道,并显示你为进行这种检查所支付的费用
  2. 检查特定类型通常是设计有缺陷的标志。在某些情况下需要它,但这种情况很少见,总的来说我个人的意见是一般不应该宽恕它,这样的功能就可以了。