Является ли платформа:: 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).