7


2

どのワイド文字列構造を使用しますか? CString vs wstring
私はstd

stringとstd :: wstringを使用するC ++のMFCアプリケーションを使用し、頻繁に一方から他方にキャストします。 すべてを単一の形式に標準化する必要があるため、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);

3 Answer


10


std

basic_string <>(またはむしろその専門化)を使用するのは恐ろしく、それはSTLの大きな欠点の1つです(そして、一般的にC ++と言えます)。 それはエンコードについても知りません-これは2010年です。 キャラクターのサイズを定義するだけでは十分ではありません。「basic_string <>に可変サイズの文字を示す方法がないからです。 さて、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の独断的な解雇を防止します。WindowsGUIで使用する場合、アプリケーションはとにかくWindows専用です。 そうは言っても、コードが将来クロスプラットフォームである必要がある可能性がある場合、basic_string <>にこだわることになります。


9


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

既に述べたように、 CString`には文字列の読み込みと BSTR`などへの変換を支援する組み込み関数もあります。これらはすべてWindowsで動作するように事前に作成され、既に構築されています。 したがって、1つの形式で標準化する必要がある場合でも、作業を簡単にしてみませんか?


3


std

wstringは、より移植性が高く、STLおよびboostの既存の多数の既存のコードの恩恵を受けます。 CStringはおそらくWindows APIの方がうまくいくでしょう。

wchat_t:data()関数を使用すると、いつでもwstringからデータを取得できるため、必要なwchar_tポインターを取得できます。

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

プラットフォーム依存に関しては、 `std

basic_string`を使用して、1文字の長さを何にしたいかに基づいて独自の文字列を定義できることを思い出してください。

毎日wstringに行きます。