代码之家  ›  专栏  ›  技术社区  ›  IceCold

在C++ Builder中如何编写Delphi等价的“IS”和“AS”?

  •  4
  • IceCold  · 技术社区  · 7 年前

    我想写一个函数(或者甚至一个操作符,如果可能的话),它做的事情类似于Delphi的“is”。 Delphi示例:

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

    所以,在C++中 可能是这样的:

    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 回复  |  直到 7 年前
        1
  •  3
  •   divinas    7 年前

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

    答:

    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. 您可以在任何地方使用动态\u cast,它更为惯用,并向您显示执行此类检查所需的成本
    2. 检查特定类型通常是有缺陷设计的标志。在某些情况下,它是需要的,但这是罕见的,一般来说,我个人的意见是,它不应该被纵容,一般来说,这样的功能会做。