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#.
That is because it isn't intended to be a std::string replacement. From the docs:
http://msdn.microsoft.com/en-us/library/windows/apps/hh699879.aspx
So the bottom line is: use
std::wstring
like you were used to in C++ and only convert toPlatform::String
when needed.I think that it is probably better that way, because
Platform::String
has some pretty confusing semantics (for examplenullptr
and the empty string are the same thing, soref new String() == nullptr
is true).The Windows Runtime string type,
HSTRING
is immutable and is reference counted.The
Platform::String
type in C++/CX is simply a wrapper around theHSTRING
type and the handful of operations that it supports (see the functions that start withWindows
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++'sstd::wstring
).Platform::String
does provideBegin()
andEnd()
member functions (and non-memberbegin()
andend()
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 usingstd::find
to find the index of the first occurrence of a character.If you need to mutate a string, use
std::wstring
orstd::vector<wchar_t>
. Ideally, consider using the C++std::wstring
as much as possible in your program and only use the C++/CXPlatform::String
where you need to interoperate with other Windows Runtime components (i.e., across the ABI boundary).