11

「WindowsStore」(別名Metro Style)アプリケーションのC ++ / CXで数行のコードを書き込もうとしていますが、Platform::Stringに「replace」 replace」などの基本的な文字列操作が多くないことに驚いています。 "のインデックス

内部データを使用してstd:stringインスタンスに渡し、必要な操作を適用できると思いますが、これらの操作を実行するための「プラットフォーム::*のみ」の方法がないかどうかを知りたいと思います。

この質問はC#ではなくC ++/CXに関するものであることに注意してください。

4

2 に答える 2

19

Windowsランタイムの文字列型HSTRINGは不変であり、参照カウントされます。

C ++ / CXの型Platform::Stringは、型とそれがサポートするいくつかの操作の単なるラッパーです( WindowsランタイムC ++関数リストのHSTRINGで始まる関数を参照してください)。Windows

文字列型は不変であるため、文字列を変更する操作はありません(したがって、がないのはなぜですかReplace)。いくつかの非変更操作があります(確かにC ++よりも少ないですstd::wstring)。

Platform::Stringランダムアクセスイテレータを文字列に返すメンバー関数(および非メンバー関数Begin()とオーバーロード)を提供します(ポインタ、、、およびポインタは有効なランダムアクセスイテレータです)。これらのイテレータは、ランダムアクセスイテレータを使用し、基になるシーケンスを変更しようとしないC++標準ライブラリアルゴリズムのいずれかで使用できます。たとえば、を使用して文字の最初の出現のインデックスを見つけることを検討してください。End()begin()end()wchar_t const*std::find

文字列を変更する必要がある場合は、std::wstringまたはを使用しますstd::vector<wchar_t>。理想的にstd::wstringは、プログラムで可能な限りC ++を使用することを検討し、Platform::String他のWindowsランタイムコンポーネントと相互運用する必要がある場合(つまり、ABI境界を越えて)にのみC ++/CXを使用してください。

于 2012-09-21T16:55:12.327 に答える
11

これは、std::stringの置換を目的としていないためです。ドキュメントから:

Platform :: Stringクラスは、いくつかの一般的な文字列操作のメソッドを提供しますが、フル機能の文字列クラスになるようには設計されていません。C ++モジュールでは、重要なテキスト処理にwstringなどの標準のC ++文字列型を使用し、パブリックインターフェイスとの間でやり取りする前に、最終結果をPlatform ::String^に変換します。

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

つまり、要点は次のとおりstd::wstringです。C++で慣れていたように使用し、必要な場合にのみ変換しPlatform::Stringます。

かなり紛らわしいセマンティクスがあるので、おそらくその方が良いと思いますPlatform::String(たとえばnullptr、空の文字列は同じものなので、ref new String() == nullptr本当です)。

于 2012-09-21T16:39:51.417 に答える