Является ли платформа:: String настолько бесполезной?

Я пытаюсь написать несколько строк кода в С++/CX в приложении "Windows Store" (aka Metro Style), и я с удивлением вижу, что Платформа:: В строке отсутствуют многие основные операции с строкой, такие как или .

Я полагаю, что я мог бы использовать внутренние данные, передать их в экземпляр std: string и применить нужные мне операции, но я хотел бы знать, не хватает ли мне какого-то метода "Только для платформы:: *" для выполнения этих операций.

Обратите внимание, что этот вопрос касается С++/CX, а не С#.

Ответ 1

Строка строки Runtime Windows, HSTRING является неизменной и подсчитывается по ссылке.

Тип Platform::String в С++/CX - это просто оболочка типа HSTRING и несколько поддерживаемых операций (см. функции, начинающиеся с Windows в .

Нет операций, которые мутируют строку, потому что тип строки неизменен (следовательно, нет Replace). Есть несколько не мутирующих операций (конечно, меньше С++ std::wstring).

Platform::String предоставляет Begin() и End() функции-члены (и не-членные Begin() и End() перегрузки), которые возвращают итераторы произвольного доступа в строку (они возвращают указатели, wchar_t const* и указатели являются действительными итераторами произвольного доступа). Вы можете использовать эти итераторы с любыми алгоритмами стандартной библиотеки С++, которые используют итераторы с произвольным доступом и не пытаются изменить базовую последовательность. Например, рассмотрите возможность использования std::find для поиска индекса первого вхождения символа.

Если вам нужно изменить строку, используйте std::wstring или std::vector<wchar_t>. В идеале рассмотрите возможность использования С++ std::wstring как можно больше в вашей программе и используйте только С++/CX Platform::String, где вам необходимо взаимодействовать с другими компонентами Windows Runtime (т.е. Через границу ABI).

Ответ 2

Это потому, что он не предназначен для замены std::string. Из документов:

Класс Platform:: String предоставляет методы для нескольких общих операций с строками, но не предназначен для полнофункционального строкового класса. В своем модуле С++ используйте стандартные типы строк С++, такие как wstring для любой значительной обработки текста, а затем преобразуйте окончательный результат в Platform:: String ^, прежде чем передавать его в открытый или открытый интерфейс.

http://msdn.microsoft.com/en-us/library/windows/apps/hh699879.aspx

Итак, нижняя строка: используйте std::wstring, как вы привыкли на С++, и только конвертируйте в Platform::String, когда это необходимо.

Я думаю, что это, вероятно, лучше, потому что Platform::String имеет некоторую довольно запутанную семантику (например, nullptr, а пустая строка - одно и то же, поэтому ref new String() == nullptr - true).