Is Platform::String really so useless?

c++-cx, visual-c++, windows-8, windows-runtime

Solution

The Windows Runtime string type, `HSTRING` is immutable and is reference counted.

The `Platform::String` type in C++/CX is simply a wrapper around the `HSTRING` type and the handful of operations that it supports (see the functions that start with `Windows` in the Windows Runtime C++ Functions list).

There are no operations that mutate the string because the string type is immutable (hence why there is no `Replace`). There are a few non-mutating operations (certainly fewer than C++'s `std::wstring`).

`Platform::String` does provide `Begin()` and `End()` member functions (and non-member `begin()` and `end()` overloads) that return random access iterators into the string (they return pointers, `wchar_t const*`, and pointers are valid random access iterators). You can use these iterators with any of the C++ Standard Library algorithms that take random access iterators and do not attempt to mutate the underlying sequence. For example, consider using `std::find` to find the index of the first occurrence of a character.

If you need to mutate a string, use `std::wstring` or `std::vector<wchar_t>`. Ideally, consider using the C++ `std::wstring` as much as possible in your program and only use the C++/CX `Platform::String` where you need to interoperate with other Windows Runtime components (i.e., across the ABI boundary).

Problem

I am trying to write a few lines of code in C++/CX in a "Windows Store" (aka Metro Style) application, and I am surprised to see that Platform::String is missing many basic string operations like "replace" or "index of". I suppose I could use the internal data, pass it to a std:string instance and apply the operations I need, but I would like to know if I am missing some "Platform::* only" way of doing these operations. Please note this question is about C++/CX, not C#.

Original source