【问题标题】:Is Platform::String really so useless?Platform::String 真的那么没用吗?
【发布时间】:2012-09-14 01:46:51
【问题描述】:

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

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

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

【问题讨论】:

  • SO 是一个问题站点,而不是一个错误跟踪器,所以标题应该是一个问题,而不是一个投诉 ;-)
  • String::Begin, String::End, 你还需要什么?
  • 字符串有迭代器,不能简单的使用标准算法吗?
  • Platform::String 是不可变的,因此像“替换”这样的变异操作毫无意义。通过在标准算法中使用迭代器,可以很好地完成非变异操作。在我看来它一点用都没有。
  • 没关系,这似乎是一个文档错误 (twitter.com/JamesMcNellis/status/249183128097259522)。它确实是不可变的。

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


【解决方案1】:

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

C++/CX 中的Platform::String 类型只是对HSTRING 类型及其支持的少数操作的包装(请参阅Windows Runtime C++ Functions 列表中以Windows 开头的函数)。

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

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

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

【讨论】:

  • 嗨。感谢您的回答。你介意看看this question吗?感觉像是在c++测试框架中发现了一个bug……
  • @yms:这是个好问题;我不确定答案,但我可以尝试找到可以回答的人。对于它的价值,我发现同步所有异步操作(使用自旋等待,以规避 STA 阻塞限制)对于单元测试很有用。这样做很简单直接;您可以在my CxxReflect project's unit test code 中看到一个通用示例。
【解决方案2】:

那是因为它不打算成为 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 是真的)。​​

【讨论】:

  • Platform::String 有奇怪的语义,是的,尤其是关于“null”。奇怪之处主要是由于 Windows 运行时字符串类型 HSTRING 是一种值类型(因此没有“空”值)但类型 引用计数并需要显式创建和破坏。从某种意义上说,它有点混合了值类型和引用类型。
猜你喜欢
  • 2011-11-12
  • 2013-05-07
  • 2012-02-13
  • 2010-12-27
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2012-12-04
相关资源
最近更新 更多