11

我正在尝试在“Windows Store”(又名 Metro Style)应用程序中用 C++/CX 编写几行代码,我很惊讶地看到Platform::String缺少许多基本的字符串操作,例如“replace”“的索引”

我想我可以使用内部数据,将其传递给 std:string 实例并应用我需要的操作,但我想知道我是否遗漏了一些“仅限平台::*”的方式来执行这些操作。

请注意这个问题是关于 C++/CX,而不是 C#。

4

2 回答 2

19

Windows 运行时字符串类型HSTRING是不可变的并且是引用计数的。

C++/CX 中的类型Platform::String只是类型和它支持的少数操作的包装器(请参阅Windows 运行时 C++ 函数列表中HSTRING以开头Windows的函数)。

没有改变字符串的操作,因为字符串类型是不可变的(因此没有Replace)。有一些非变异操作(肯定少于 C++ 的std::wstring)。

Platform::String确实提供了将随机访问迭代器返回到字符串中Begin()End()成员函数(以及非成员begin()end()重载)(它们返回指针wchar_t const*, 和指针是有效的随机访问迭代器)。您可以将这些迭代器与任何采用随机访问迭代器的 C++ 标准库算法一起使用,并且不会尝试改变底层序列。例如,考虑使用std::find查找字符第一次出现的索引。

如果您需要更改字符串,请使用std::wstringor std::vector<wchar_t>。理想情况下,请考虑std::wstring在您的程序中尽可能多地使用 C++,并且仅Platform::String在需要与其他 Windows 运行时组件互操作的地方(即跨 ABI 边界)使用 C++/CX。

于 2012-09-21T16:55:12.327 回答
11

那是因为它不打算成为 std::string 的替代品。从文档:

Platform::String 类为几种常见的字符串操作提供了方法,但它并没有被设计成一个功能齐全的字符串类。在您的 C++ 模块中,使用标准 C++ 字符串类型(例如 wstring)进行任何重要的文本处理,然后将最终结果转换为 Platform::String^,然后再将其传递到公共接口或从公共接口传出。

http://msdn.microsoft.com/en-us/library/windows/apps/hh699879.aspx

所以底线是:std::wstring像以前在 C++ 中一样使用,并且只Platform::String在需要时转换。

我认为这样可能会更好,因为Platform::String它有一些非常令人困惑的语义(例如nullptr,空字符串是同一件事,所以ref new String() == nullptr是真的)。

于 2012-09-21T16:39:51.417 回答