Platform :: String真的没用吗?

时间:2012-09-21 15:49:59

标签: visual-c++ windows-8 windows-runtime c++-cx

我试图在“Windows Store”(又名Metro Style)应用程序中用C ++ / CX编写几行代码,我很惊讶Platform::String缺少许多基本字符串操作,如{ {3}}或"replace"

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

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

2 个答案:

答案 0 :(得分:18)

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

C ++ / CX中的Platform::String类型只是HSTRING类型的包装器及其支持的少数几个操作(请参阅Windows中以Replace开头的函数。 3}} list)。

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

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

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

答案 1 :(得分:11)

这是因为它不打算成为std :: string替换。来自文档:

  

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

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

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

我认为这样做可能更好,因为Platform::String有一些相当混乱的语义(例如nullptr而空字符串是相同的,所以ref new String() == nullptr为真)