Как конвертировать CString и :: std :: string :: std :: wstring друг в друга? - PullRequest
66 голосов
/ 03 ноября 2008

CString довольно удобен, а std::string более совместим с контейнером STL. Я использую hash_map. Однако hash_map не поддерживает CString в качестве ключа, поэтому я хочу преобразовать CString в std::string.

Запись хэш-функции CString, похоже, занимает много времени.

CString -----> std::string

Как я могу это сделать?

std::string -----> CString:

inline CString toCString(std::string const& str)
{
    return CString(str.c_str()); 
}

Я прав?


EDIT:

Вот еще вопросы:

Как я могу преобразовать wstring, CString друг в друга?

//wstring -> CString,
std::wstring src;
CString result(src.c_str());
//CString->wstring. 
CString src;
::std::wstring des(src.GetString());

Есть ли какая-либо проблема?

Как я могу конвертировать std::wstring, std::string друг в друга?

Ответы [ 14 ]

0 голосов
/ 17 октября 2017

Один интересный подход - привести CString к CStringA внутри string конструктора. В отличие от std::string s((LPCTSTR)cs); это будет работать, даже если определено _UNICODE. Однако в этом случае будет выполнено преобразование из Unicode в ANSI, поэтому небезопасно для более высоких значений Unicode, выходящих за пределы набора символов ASCII. Такое преобразование зависит от определения препроцессора _CSTRING_DISABLE_NARROW_WIDE_CONVERSION. https://msdn.microsoft.com/en-us/library/5bzxfsea.aspx

        CString s1("SomeString");
        string s2((CStringA)s1);
0 голосов
/ 30 июня 2017

Все остальные ответы не совсем касались того, что я искал, чтобы конвертировать CString на лету, а не сохранять результат в переменной.

Решение похоже на приведенное выше, но нам нужен еще один шаг для создания экземпляра безымянного объекта. Я иллюстрирую на примере. Вот моя функция, которая нуждается в std::string, но у меня есть CString.

void CStringsPlayDlg::writeLog(const std::string &text)
{
    std::string filename = "c:\\test\\test.txt";

    std::ofstream log_file(filename.c_str(), std::ios_base::out | std::ios_base::app);

    log_file << text << std::endl;
}

Как позвонить, когда у вас есть CString?

std::string firstName = "First";
CString lastName = _T("Last");

writeLog( firstName + ", " + std::string( CT2A( lastName ) ) );     

Обратите внимание, что последняя строка не является прямой трансляцией типов, но мы создаем безымянный объект std::string и предоставляем CString через его конструктор.

0 голосов
/ 10 ноября 2015

у меня работает:

std::wstring CStringToWString(const CString& s)
{
    std::string s2;
    s2 = std::string((LPCTSTR)s);
    return std::wstring(s2.begin(),s2.end());
}

CString WStringToCString(std::wstring s)
{
    std::string s2;
    s2 = std::string(s.begin(),s.end());
    return s2.c_str();
}
0 голосов
/ 20 февраля 2009

Если вы хотите легко преобразовывать строки в другие типы, возможно, вам подойдет класс _bstr_t? Он поддерживает разговор между char, wchar_t и BSTR.

...