【问题标题】:How to check an object's type in C++/CLI?如何在 C++/CLI 中检查对象的类型?
【发布时间】:2011-01-25 12:38:05
【问题描述】:

有没有简单的方法来检查对象的类型?我需要以下方面的东西:

MyObject^ mo = gcnew MyObject();
Object^ o = mo;

if( o->GetType() == MyObject )
{
    // Do somethine with the object
}
else
{
    // Try something else
}

目前,我正在使用嵌套的 try-catch 块来寻找 System::InvalidCastExceptions,这感觉很丑但很有效。我打算尝试分析类似于上面的代码的东西,看看它是否更快/更慢/可读,但甚至无法找出语法来尝试。

如果有人想知道,这是因为有一个队列进入了一个线程,该线程提供了要处理的数据。偶尔我想更改设置并通过数据队列传递它们是一种简单的方法。

【问题讨论】:

    标签: c++-cli types detection


    【解决方案1】:

    您可以在 C++/CLI 中使用 MyObject::typeid,就像在 C# 中使用 typeof(MyObject) 一样。下面的代码无耻地从您的问题中复制并修改...

    MyObject^ mo = gcnew MyObject();
    Object^ o = mo;
    
    if( o->GetType() == MyObject::typeid )
    {
        // Do somethine with the object
    }
    else
    {
        // Try something else
    }
    

    【讨论】:

    • 它在 VS2010 中仍然有效。我没有 VS2012,所以无法评论最新的 VS 版本。可能你没有“看到那个 typeid 成员”,因为 VS2010 中没有包含 C++/CLI 的自动完成功能。
    • 我什至可以在 VS2013 中使用它。
    【解决方案2】:

    你应该看看How to: Implement is and as C# Keywords in C++:

    本主题展示了如何在 Visual C++ 中实现 is 和 as C# 关键字的功能。

    【讨论】:

    • 有没有办法使用泛型而不是模板来做到这一点,以便可以在外部程序集中使用该方法?
    【解决方案3】:

    编辑:我将把它留在这里。但这个答案适用于 C++。可能甚至与为 CLI 执行此操作无关。

    你需要在编译时开启 RTTI(Run Time Type Information)。然后查看维基百科文章http://en.wikipedia.org/wiki/Run-time_type_information 并在谷歌搜索RTTI。应该为你工作。

    另一方面,您可能希望为所有数据类创建一个虚拟基类,并使用一个描述其类型的成员变量。

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2023-04-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多