如何使用聚合初始化来初始化 c++/cx class?

How to initialize c++/cx class with aggregate initialization?

我有这个参考 class:

namespace N 
{       
  public ref class S sealed
  {
    public:
      property Platform::String^ x;
  };
}

如何使用聚合初始化器就地初始化它? 我试过:

N::S s1 = { %Platform::String(L"text") };

但是编译器说

error C2440: 'initializing': cannot convert from 'initializer list' to 'N::S'

还有:

N::S s1 { %Platform::String(L"text") };

错误是:

error C2664: 'N::S::S(const N::S %)': cannot convert argument 1 from 'Platform::String ^' to 'const N::S %'

这对标准的 c++ 非常有效,如下所示:

struct T
    {
        wstring x;
    };
T x { L"test" };

我不想在这里使用构造函数。

我假设你的意思是你不想在投影的 WinRT 类型上使用 public 构造函数——没问题,你可以使用 internal 关键字来表示 "public inside C++ but not exposed through interop"。这意味着您甚至可以根据需要使用本机 C++ 类型作为参数:

namespace Testing
{
  public ref class MyTest sealed
  {
  public:
    property String^ Foo { 
      String^ get() { return m_foo; }
      void set(String^ value) { m_foo = value; }
    }

  internal:
    // Would not compile if it was public, since wchar_t* isn't valid
    MyTest(const wchar_t* value) { m_foo = ref new String(value); }

  private:
    String^ m_foo;
  };
}

MainPage::MainPage()
{
  // Projected type does NOT have this constructor
  Testing::MyTest t{ L"Hello" };
  OutputDebugString(t.Foo->Data());
  t.Foo = "\nChanged";
  OutputDebugString(t.Foo->Data());
}

此外,您不需要 private 变量来保存字符串——您可以像在原始代码中那样使用 auto-属性——但我更喜欢明确的。这也意味着,如果您需要从 C++ 代码中大量访问字符串,您可以提供一个 internal 访问器函数,而不必通过 vtable 调用来获取它。