estilo adequado para interface com código TCHAR legado
Pergunta
Estou modificando o código de outra pessoa que usa TCHAR extensivamente.É melhor usar apenas std::wstring no meu código?wstring deve ser equivalente a TString em plataformas widechar, então não vejo problema.A razão é que é mais fácil usar uma wstring bruta do que suportar TCHAR...por exemplo, usando boost:wformat.
Qual estilo ficará mais claro para o próximo mantenedor?Eu perdi várias horas tentando entender as complexidades das cordas, parece que apenas usar wstring cortaria metade das coisas que você precisa entender.
typedef std::basic_string<TCHAR> TString; //on winxp, TCHAR resolves to wchar_t
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
...a única diferença é o alocador.
No caso improvável de seu programa pousar em uma máquina de 9x de janela, ainda há uma camada de API que pode traduzir suas seqüências de caracteres UTF-16 em chars de 8 bits.Não há sentido em usar o TCHAR para um novo desenvolvimento de código. fonte
Solução
Se você pretende atingir apenas plataformas Unicode (wchar_t), é melhor usar std::wstring.Se quiser oferecer suporte a compilações multibyte e Unicode, você precisará usar TString e similares.
Observe também que basic_string padroniza char_traits e alocador para um baseado no tipo de caractere passado, portanto, em compilações em que UNICODE (ou _UNICODE, nunca me lembro qual), TString e wstring serão iguais.
OBSERVAÇÃO:Se você está apenas passando os argumentos para várias APIs e não fazendo nenhuma manipulação neles, é melhor usar const wchar_t *
em vez de std::wstring diretamente (especialmente se misturar código Win32, COM e C++ padrão), pois você acabará fazendo menos conversões e cópias.
Outras dicas
TCHAR costumava ser mais importante quando você compilava os binários duas vezes, uma vez para char e uma segunda para wchar_t.
Você ainda pode fazer essa escolha, se desejar, alterando as configurações do projeto MSVC de MBCS para Unicode e vice-versa.
Isso também significa que ao chamar a API do Windows você terá o tipo de dados correspondente.