Quelle structure chaîne de caractères larges dois-je utiliser? CString vs wstring
Question
J'ai une application MFC en C ++ qui utilise std :: string et std :: wstring et jette souvent de l'un à l'autre, et beaucoup d'autres absurdités. Je dois standardiser tout à un seul format, donc je me demandais si je devais aller avec CString ou std :: wstring.
Dans l'application, je vais devoir générer des chaînes d'une table à cordes, travailler avec beaucoup de fenêtres appels qui nécessitent TCHAR constant ou pointeurs wchar_t, éditer les commandes, et d'interagir avec l'API d'un objet COM qui nécessite BSTR.
J'ai aussi des vecteurs de chaînes, donc est-il un problème avec un vecteur de CStrings?
Lequel est le meilleur? Quels sont les avantages et les inconvénients de chacun?
Exemples
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;
chaîne de ressource à wstring
CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;
GetProfileString () retourne un CString.
entier au format chaîne:
wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
La solution
std :: basic_string <> (ou plutôt ses spécialisations) est horrible de travailler avec, il est imo l'une des principales lacunes de la STL (et je dirais que C ++ en général). Il ne sait même pas encodages - Vas-y, c'est 2010. Être capable de définir la taille de votre personnage ne suffit pas, parce qu'il n'y a aucun moyen d'indiquer des caractères de taille variable dans un basic_string <>. Maintenant, utf-8 n'est pas agréable de travailler avec un CString, mais ce n'est pas aussi mauvais que d'essayer de le faire avec basic_string. Bien que je suis d'accord avec l'esprit des affiches ci-dessus qu'une solution standard est mieux que les autres, CString est (si votre projet utilise MFC ou ATL de toute façon) beaucoup plus agréable de travailler avec de std :: string / wstring: conversions entre ANSI / Unicode (par CStringA et CStringW), BSTR, chargement de la table de chaîne, les opérateurs exprimés à TCHAR (.c_str ()? vraiment?), ...
CString a également Format (), qui, bien sûr et pas assez laid, est pratique. Si vous préférez les bibliothèques de formatage de sécurité, vous serez mieux avec basic_string.
En outre, CString a des algorithmes comme des fonctions membres que vous aurez besoin des utilitaires de chaîne de coup de pouce pour le faire sur basic_string tels que l'assiette, diviser etc.
vecteurs de CString sont pas de problème.
Garde contre un licenciement dogmatique de CString sur la base de celui-ci étant Windows uniquement: si vous l'utilisez dans une interface graphique Windows, l'application est uniquement sous Windows de toute façon. Cela étant dit, s'il y a une chance que votre code devra être multi-plateforme à l'avenir, vous allez être coincé avec basic_string <>.
Autres conseils
Personnellement, j'aller avec CString
s dans ce cas, puisque vous déclarez que vous travaillez avec BSTR
s, en utilisant COM et écrire ceci dans MFC. Alors que wstring
s serait plus conforme aux standards vous rencontrez des problèmes avec la conversion constante d'une à l'autre. Puisque vous travaillez avec COM et de l'écriture dans MFC, il n'y a aucune raison de vous soucier de rendre multi-plateforme, car aucun autre système d'exploitation comme Windows a COM et MFC est déjà vous verrouillent dans Windows.
Comme vous l'avez dit, CString
s ont également des fonctions intégrées pour aider les chaînes de charge et de se convertir à BSTR
s, etc., tous les pré-faites et déjà conçu pour fonctionner avec Windows. Ainsi, alors que vous avez besoin de standardiser un format, pourquoi ne pas le rendre plus facile à travailler?
std :: wstring serait beaucoup plus facile à transporter, et bénéficier d'une grande quantité de code existant dans préécrite STL et coup de pouce. CString irait probablement mieux avec Windows API.
wchat_t. Rappelez-vous que vous pouvez obtenir les données sur wstring tout moment en utilisant les données () fonction, de sorte que vous obtenez le besoin wchar_t pointeur de toute façon
BSTR:. Utiliser SysAllocString pour obtenir le BSTR d'un wstring.data ()
En ce qui concerne la plate-forme Dependance, rappelez-vous que vous pouvez utiliser std::basic_string<T>
pour définir votre propre chaîne, en fonction de ce que vous voulez que la longueur d'un seul caractère soit.
Je vais pour wstring tous les jours ....