Visual c++ Platform::String真的那么没用吗?

Visual c++ Platform::String真的那么没用吗?,visual-c++,windows-8,windows-runtime,c++-cx,Visual C++,Windows 8,Windows Runtime,C++ Cx,我正试图在“Windows应用商店”(又名Metro风格)应用程序中用C++/CX编写几行代码,但我惊讶地发现,它缺少了许多基本的字符串操作,如or 我想我可以使用内部数据,将其传递给std:string实例并应用所需的操作,但我想知道我是否缺少一些执行这些操作的“平台::*唯一”方法 请注意,这个问题是关于C++/CX的,而不是关于C#。这是因为它不是用来替换std::字符串的。从文档中: StringPlatform::String类为几种常见的字符串操作提供了方法,但它不是设计为功能齐全的

我正试图在“Windows应用商店”(又名Metro风格)应用程序中用C++/CX编写几行代码,但我惊讶地发现,它缺少了许多基本的字符串操作,如or

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


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

这是因为它不是用来替换std::字符串的。从文档中:

StringPlatform::String类为几种常见的字符串操作提供了方法,但它不是设计为功能齐全的字符串类。在C++模块中,使用标准的C++字符串类型(如WString)进行任何重要的文本处理,然后将最终结果转换为Struts:String ^,然后将其传递到公共接口。


<> >底线是:使用<代码> STD::WString ,就像您在C++中使用的,只转换为<代码>平台::在需要时,字符串< /代码>。
我认为这样可能更好,因为
Platform::String
有一些非常混乱的语义(例如
nullptr
和空字符串是一样的,所以
ref new String()==nullptr
是真的)。

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


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

由于字符串类型是不可变的(因此没有
Replace
),因此没有对字符串进行变异的操作。有一些非变异操作(当然比C++的
std::wstring
要少)


Platform::String
确实提供了
Begin()
End()
成员函数(以及非成员
Begin()
End()
重载),它们将随机访问迭代器返回到字符串中(它们返回指针,
wchar\u t const*
,指针是有效的随机访问迭代器)。您可以使用这些迭代器与C++标准库算法中的任意一个进行随机访问迭代器,而不尝试对基础序列进行突变。例如,考虑使用<代码> STD::查找< /COD>查找字符的第一次出现的索引。


如果需要对字符串进行变异,请使用
std::wstring
std::vector
。理想情况下,在程序中尽可能多地使用C++ <代码> STD::WString ,只使用C++ +CX<代码>平台:String ,在那里您需要与其他Windows运行时组件(即,跨越ABI边界)进行互操作。

所以是问号站点,而不是bug跟踪器,因此标题应该是一个问题,不是投诉;-),你还需要什么?字符串有迭代器,难道你不能简单地使用标准算法吗?平台::字符串是不可变的,所以像“替换”这样的变异操作没有意义。在标准算法中使用迭代器可以很好地完成非变异操作。在我看来,它一点用处也没有。尽管如此,它似乎是一个文档错误()。它确实是不可变的。
Platform::String
有奇怪的语义,是的,特别是关于“null”。这些奇怪之处主要是因为Windows运行时字符串类型
HSTRING
,是一种值类型(因此没有“null”值),但该类型是引用计数的,需要显式创建和销毁。从某种意义上说,它是值类型和引用类型之间的混合。谢谢你的回答。你介意看一看吗?这感觉就像是在C++测试框架中发现了一个bug…@ YMS:这是个好问题;我不确定答案,但我可以试着找到能回答的人。值得一提的是,我发现同步所有异步操作对于单元测试非常有用(使用旋转等待,以绕过STA阻塞限制)。这样做既简单又直接;您可以在中看到一个通用示例。