Pregunta

Tengo una aplicación MFC en C ++ que utiliza std :: string y std :: wstring, y arroja con frecuencia de una a la otra, y un montón de otras cosas sin sentido. Necesito estandarizar todo a un solo formato, así que me preguntaba si debería ir con CString o std :: wstring.

En la aplicación, voy a tener que generar cadenas de una tabla de cadenas, el trabajo con una gran cantidad de llamadas ventanas que requieren TCHAR constante o punteros wchar_t, controles de edición, e interactuar con la API de un objeto COM que requiere BSTR.

También tengo vectores de cadenas, por lo que es necesario que tome con un vector de CStrings?

¿Cuál es mejor? ¿Cuáles son los pros y los contras de cada uno?

Ejemplos

BSTR a wstring

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

wstring a BSTR

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

cadena de recursos a wstring

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

GetProfileString () devuelve un CString.

número entero de formato de cadena:

wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
¿Fue útil?

Solución

std :: basic_string <> (o más bien sus especializaciones) es horrible para trabajar, es imo una de las principales deficiencias de la STL (y yo diría que C ++ en general). Ni siquiera se sabe acerca de las codificaciones - vamos, esto es 2010. Ser capaz de definir el tamaño de su carácter no es suficiente, porque no hay manera de indicar caracteres de tamaño variable en un basic_string <>. Ahora, UTF-8 no es agradable trabajar con un CString, pero no es tan malo como tratando de hacerlo con basic_string. Aunque estoy de acuerdo con el espíritu de los carteles anteriores que una solución estándar es mejor que las alternativas, CString es (si su proyecto utiliza MFC o ATL todos modos) mucho más agradable de trabajar que std :: string / wstring: conversiones entre ANSI / Unicode (a través de CStringA y CStringW), BSTR, la carga de la tabla de cadenas, operadores de conversión a TCHAR (.c_str ()? verdad?), ...

CString también tiene Format (), que, aunque no es seguro y algo feo, es conveniente. Si prefiere bibliotecas de formato seguras, podrás mejor con basic_string.

Además, CString tiene algunos algoritmos como funciones miembro que necesitará utilidades cadena impulso para hacer el basic_string tales como recorte, dividir, etc.

Vectors de CString no son un problema.

Guardia contra un despido dogmática de CString sobre la base de que sea sólo para Windows: si lo usa en una interfaz gráfica de usuario de Windows, la aplicación es sólo para Windows de todos modos. Una vez dicho esto, si es que hay alguna posibilidad de que el código tendrá que ser multiplataforma en el futuro, que va a ser pegado con basic_string <>.

Otros consejos

Yo personalmente iría con CStrings en este caso, ya que ustedes afirman que se trabaja con BSTRs, mediante COM, y escribiendo esto en MFC. Mientras wstrings sería más compatible con las normas se encontrará con problemas con la constante de conversión de uno a otro. Puesto que usted está trabajando con COM y escribirlo en MFC, no hay ninguna razón real para preocuparse por lo que es multiplataforma, ya que ningún otro sistema operativo como Windows tiene COM y MFC está ya te bloqueo en Windows.

Como se anotó, CStrings también han incorporado funciones de cadenas de carga de ayuda y convertir a BSTRs y similares, todos los pre-hecha y ya incorporado al trabajo con Windows. Así, mientras que usted necesita para estandarizar en un formato, por qué no hacer que sea más fácil trabajar con?

std :: wstring serían mucho más fáciles de transportar, y beneficiarse de una gran cantidad de código escrito previamente en AWL y en alza. CString probablemente iría mejor con ventanas API.

wchat_t:. Recuerde que usted puede obtener los datos de wstring cualquier momento mediante el uso de los datos () función, por lo que obtener el puntero wchar_t necesaria de todos modos

BSTR:. SysAllocString uso para obtener el BSTR de un wstring.data ()

En cuanto a la dependencia plataforma, recuerde que puede utilizar std::basic_string<T> para definir su propia cadena, en base a lo que quiere la longitud de un solo carácter a ser.

me gustaría ir para wstring todos los días ....

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top