如何使用聚合初始化来初始化 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 调用来获取它。
我有这个参考 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 调用来获取它。