平台::字符串真的如此无用吗?

11
我正在尝试在“Windows Store”(又称为Metro Style)应用程序中使用C++/CX编写一些代码,令我惊讶的是Platform::String缺少许多基本字符串操作,如"replace""index of"
我想我可以使用内部数据将其传递到std:string实例中并应用所需的操作,但我想知道是否有一些“Platform::* only”的方法来执行这些操作。
请注意,此问题涉及的是C++/CX,而不是C#。

7
SO是一个问题网站,而不是缺陷追踪器,因此标题应该是一个问题,而不是抱怨。;-) - Steve Jessop
2
String::Begin, String::End,你还需要什么? - Benjamin Lindley
2
这个字符串有迭代器,难道你不能简单地使用标准算法吗? - Etienne de Martel
3
Platform::String 是不可变的,因此像“replace”这样的变异操作是没有意义的。通过使用标准算法中的迭代器,可以轻松地执行非变异操作。对我来说,它一点也不无用。 - R. Martinho Fernandes
3
没关系,看起来这是一个文档错误(https://twitter.com/JamesMcNellis/status/249183128097259522)。它确实是不可变的。 - R. Martinho Fernandes
显示剩余5条评论
2个回答

19
Windows Runtime 字符串类型 HSTRING 是不可变的,且具有引用计数功能。
C++/CX 中的 Platform::String 类型只是对 HSTRING 类型以及支持它的少量操作(请参见 Windows Runtime C++ 函数列表 中以 Windows 开头的函数)进行了包装。
由于字符串类型是不可变的(因此没有 Replace),所以没有任何可改变该字符串的操作。它只提供了一些非改变性操作(当然比 C++ 的 std::wstring 还要少)。 Platform::String 提供了成员函数 Begin()End()(以及非成员函数 begin()end() 重载函数),这些函数返回指向字符串的随机访问迭代器(它们返回指针 wchar_t const*,而指针是有效的随机访问迭代器)。您可以将这些迭代器与任何接受随机访问迭代器且不试图改变底层序列的 C++ 标准库算法一起使用。例如,考虑使用 std::find 查找第一个出现字符的索引。
如果您需要改变字符串,请使用 std::wstringstd::vector<wchar_t>。理想情况下,尽可能在程序中使用 C++ 的 std::wstring,仅在需要与其他 Windows Runtime 组件进行交互(即跨 ABI 边界)时才使用 C++/CX 的 Platform::String

嗨,谢谢你的回答。你介意看看这个问题吗?感觉在 C++ 测试框架中发现了一个 bug... - yms
@yms:这是一个好问题;我不确定答案,但我可以努力找到能回答它的人。就单元测试而言,我发现将所有异步操作同步化(使用旋转等待来规避STA阻塞限制)非常有用。这很简单直接,你可以在我的CxxReflect项目的单元测试代码中看到一个通用的示例。 - James McNellis

11
因为它不是旨在替代std :: string。来自文档:
“Platform :: String类提供了几种常见的字符串操作方法,但它并不是一个功能齐全的字符串类。在您的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是真的)。

2
Platform::String 的语义有些奇怪,尤其是关于“null”的部分。这些奇怪的地方主要是由于 Windows 运行时字符串类型 HSTRING 是值类型(因此没有“null”值),但该类型确实具有引用计数并需要显式创建和销毁。从某种意义上说,它是值类型和引用类型的混合体。 - James McNellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接