7

std::string と std::wstring を使用する C++ の MFC アプリケーションがあり、一方から他方へ頻繁にキャストされ、その他の多くのナンセンスがあります。すべてを 1 つの形式に標準化する必要があるため、CString と std::wstring のどちらを使用するべきか迷っていました。

アプリケーションでは、文字列テーブルから文字列を生成し、定数 tchar または wchar_t ポインターを必要とする多数の Windows 呼び出しを操作し、コントロールを編集し、BSTR を必要とする COM オブジェクトの API を操作する必要があります。

文字列のベクトルもありますが、CStrings のベクトルに問題はありますか?

どちらの方がよいですか?それぞれの長所と短所は何ですか?

BSTR から wstring へ

CComBSTR tstr;  
wstring album;  
if( (trk->get_Info((BSTR *)&tstr)) == S_OK  && tstr!= NULL)  
    album = (wstring)tstr;

wstring から BSTR

CComBSTR tstr = path.c_str();  
if(trk->set_Info(tstr) == S_OK)
    return true;

文字列リソースから wstring へ

CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;

GetProfileString() は CString を返します。

整数から文字列へのフォーマット:

wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
4

3 に答える 3

11

std::basic_string<> (またはその特殊化) を扱うのは恐ろしいことです。これは、STL の主要な欠点の 1 つです (一般的には C++ と言えます)。それはエンコーディングについてさえ知りません-さあ、これは2010年です。文字のサイズを定義できるだけでは十分ではありません。現在、utf-8 は CString を使用するのに適していませんが、basic_string を使用する場合ほど悪くはありません。標準的な解決策が代替案よりも優れているという上記のポスターの精神には同意しますが、CString は (プロジェクトが MFC または ATL を使用している場合) std::string/wstring: ANSI/Unicode 間の変換よりもはるかに優れています。 (CStringA および CStringW を介して)、BSTR、文字列テーブルからの読み込み、TCHAR (. c_str()? 本当?)、 ...

CString には Format() もあります。これは、安全ではなく、やや醜いですが、便利です。安全なフォーマット ライブラリを好む場合は、basic_string を使用した方がよいでしょう。

さらに、CString にはメンバー関数としていくつかのアルゴリズムがあり、trim、split などの basic_string で実行するためのブースト文字列ユーティリティが必要です。

CString のベクトルは問題ありません。

Windows 専用であるという理由で CString を独断的に却下しないように注意してください。Windows GUI で使用する場合、いずれにせよ、アプリケーションは Windows 専用です。そうは言っても、将来的にコードをクロスプラットフォームにする必要がある場合は、basic_string<> で行き詰まるでしょう。

于 2010-01-04T17:24:06.703 に答える
9

CStringこの場合、BSTRs を使用し、COM を使用し、これを MFC で記述していると述べているため、個人的にはs を使用します。s はより標準に準拠してwstringいますが、あるものから別のものへの絶え間ない変換で問題が発生します。COM を使用して MFC で記述しているため、Windows のような COM を備えた OS は他になく、MFC は既に Windows にロックされているため、クロスプラットフォームにすることを心配する本当の理由はありません。

お気づきのように、CStrings には、文字列をロードして s などに変換するのに役立つ組み込み関数もありBSTR、すべて事前に作成され、Windows で動作するように既にビルドされています。では、1 つの形式に標準化する必要がある一方で、作業を容易にしない理由はありません。

于 2010-01-04T17:32:02.600 に答える
3

std::wstring は移植性がはるかに高く、STL および boost の多くの既存の事前に記述されたコードの恩恵を受けます。CString はおそらく Windows API の方がうまくいくでしょう。

wchat_t : data() 関数を使用していつでも wstring からデータを取得できるので、とにかく必要な wchar_t ポインターを取得できることに注意してください。

BSTR : SysAllocString を使用して、wstring.data() から BSTR を取得します。

std::basic_string<T>プラットフォームの依存性については、1 文字の長さに基づいて独自の文字列を定義するために を使用できることを覚えておいてください。

私は毎日wstringに行きます....

于 2010-01-03T16:00:10.873 に答える