【问题标题】:How can I implement variant types in the CLR/Managed C++?如何在 CLR/托管 C++ 中实现变体类型?
【发布时间】:2009-06-04 18:52:21
【问题描述】:

在 .net 中,CLR 对象是所有类对象的基础,但不是基本类型(例如 int、float 等)。如何使用 Object 等基本类型? IE。喜欢Boost.Variant

例如喜欢 :-

object intValue( int(27) );
if (intValue is Int32)
    ...

object varArray[3];
varArray[0] = float(3.141593);
varArray[1] = int(-1005);
varArray[2] = string("String");

【问题讨论】:

  • 这是在 .net 2.0 中。我认为 3.0 更具动态性,所以也许在那里是可能的,但我只有 VS2005,它不能使用 .net 3.0。
  • C# 3.0 是您所想的,它并不是真正的动态。您看到的“var”关键字不会创建变体,只是推断类型。变量 i = 1;仍然使“i”成为 int。
  • @Nick:3.0 并不比 2.0 更有活力; C# 3.0 有“var”,但这不是“variant”——它是“variable”,意思是“自动推断类型”。它仍然是静态类型的。 C# 4.0 引入了“动态”
  • 对不起,我实际上必须在托管 C++ 中执行此操作。

标签: c# clr managed-c++ variant


【解决方案1】:

object,通过装箱,是所有 .NET 类型的有效(根)基类。这应该可以正常工作 - 您只需要使用 isGetType() 来检查类型...

object[] varArray = new object[3];
varArray[0] = 3.141593F;
varArray[1] = -1005;
varArray[2] = "String";

【讨论】:

  • 我实际上使用的是托管 C++,但它无法编译。我认为 C# 中的任何可能在 MC++ 中都应该是可能的?
  • 谢谢。我没有在托管 C++ 中返回装箱值的正确语法。
  • 是的,这是我的错。我有一个使用 MC++ 库的 c# GUI,我需要在两者中做同样的事情,但我无法获得正确的 MC++ 语法。
【解决方案2】:

既然你提到你在 C++/CLI 中,你应该能够做到:

array<Object^>^ varArray =  gcnew array<Object^>(3);

varArray[0] = 3.141593;
varArray[1] = -1005;
varARray[2] = "String";

double val = *reinterpret_cast<double^>(varArray[0]);

【讨论】:

    【解决方案3】:
    object varArray[3] = new object[3];
    varArray[0] = 3.141593;
    varArray[1] = -1005;
    varArray[2] = "String";
    

    【讨论】:

      【解决方案4】:

      感谢拳击的回答。我需要将我的返回值装箱,例如

          Object ^ createFromString(String ^ value)
          {
               Int32 i( Convert::ToInt32(value) );
               return static_cast< Object ^ >(i);
          }
      

      我需要通过转换为对象指针来装箱返回值。直觉的! :)

      并检索为:

          void writeValue(Object ^ value, BinaryWriter ^ strm)
          {
              Int32 i( *dynamic_cast< Int32 ^ >(value) );
              strm->Write(i);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        相关资源
        最近更新 更多