c++builder - 如何在 C++ Builder 中编写相当于 Delphi "is"和 "as"的代码?

标签 c++builder

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

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

所以,在 C++ 中 build 师 这将是这样的:
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 的任何类型的对象?

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

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";
}

话虽如此,我建议您避免创建这样的函数,原因有两个:
  • 您可以使用 dynamic_cast eveywhere,它更惯用,并向您显示执行此类检查所需的成本
  • 检查特定类型通常是设计有缺陷的标志。在某些情况下需要它,但这种情况很少见,总的来说,我个人的意见是一般不应宽恕它,而这样的功能会这样做。
  • 关于c++builder - 如何在 C++ Builder 中编写相当于 Delphi "is"和 "as"的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52697411/

    相关文章:

    c++ - std::bind 应该需要移动构造函数吗?

    delphi - 在 Delphi 中初始程序加载后更改一个 TStatusPanel 的颜色?

    delphi - 印地 HTTP 客户端 : sessions like in web browser

    c++ - 静态包含dll文件

    C++ 生成器 TtcpClient

    delphi - 要将复杂的应用程序从 C++Builder 2007 升级到 2010,我需要了解哪些信息?

    delphi - 如何在 Delphi 2006 或更早版本的可执行文件上启用 DEP/NX 和 ASLR?

    c++ - 如何解决 System.Zip.TZipFile.ExtractAll 未从 .zip 文件中提取所有数据的问题?

    c++ - 带有 C++ 生成器的 CUDA

    c++ - 内存访问冲突 C++ Borland