Esta es la respuesta más exacta que te podemos brindar, pero primero estúdiala pausadamente y analiza si se puede adaptar a tu proyecto.
Solución:
TCHAR
es solo una definición de tipo que, dependiendo de la configuración de compilación, tiene como valor predeterminado char
o wchar_t
.
La biblioteca de plantillas estándar es compatible con ASCII (con std::string
) y juegos de caracteres amplios (con std::wstring
). Todo lo que necesitas hacer es definición de tipo Cadena como std::string o std::wstring dependiendo de su configuración de compilación. Para mantener la flexibilidad, puede utilizar el siguiente código:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif
Ahora puedes usar String
en su código y deje que el compilador maneje las partes desagradables. String ahora tendrá constructores que le permitirán convertir TCHAR
a std::string
o std::wstring
.
El tipo TCHAR es char
o wchar_t
dependiendo de la configuración de su proyecto.
#ifdef UNICODE
// TCHAR type is wchar_t
#else
// TCHAR type is char
#endif
Así que si debes usar std::string
en vez de std::wstring
, debe utilizar una función de conversión. puedo usar wcstombs
o WideCharToMultiByte
.
TCHAR * text;
#ifdef UNICODE
/*/
// Simple C
const size_t size = ( wcslen(text) + 1 ) * sizeof(wchar_t);
wcstombs(&buffer[0], text, size);
std::vector buffer(size);
/*/
// Windows API (I would use this)
std::vector buffer;
int size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL);
if (size > 0)
buffer.resize(size);
WideCharToMultiByte(CP_UTF8, 0, text, -1, static_cast(&buffer[0]), buffer.size(), NULL, NULL);
else
// Error handling
//*/
std::string string(&buffer[0]);
#else
std::string string(text);
#endif
TCHAR es char o wchar_t, por lo que un
typedef basic_string tstring;
es una forma de hacerlo.
La otra es saltar char
en total y solo usar std::wstring
.
valoraciones y comentarios
Si te sientes motivado, tienes la opción de dejar un escrito acerca de qué le añadirías a este ensayo.