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);
Était-ce utile?

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 CStrings dans ce cas, puisque vous déclarez que vous travaillez avec BSTRs, en utilisant COM et écrire ceci dans MFC. Alors que wstrings 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, CStrings ont également des fonctions intégrées pour aider les chaînes de charge et de se convertir à BSTRs, 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 ....

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top