Какую строковую структуру широкого символа я использую? CString по сравнению с wstring

У меня есть приложение MFC в C++, который использует станд.:: строка и станд.:: wstring, и часто бросает от одного до другого и большой другой ерунды. Я должен стандартизировать все к единому формату, таким образом, я задавался вопросом, должен ли я пойти с CString или станд.:: wstring.

В приложении я должен буду генерировать строки от таблицы строк, работы с большим количеством вызовов окон, которые требуют постоянного tchar или wchar_t указателей, Средств редактирования, и взаимодействуют с API COM-объекта, который требует BSTR.

У меня также есть векторы строк, так есть ли какая-либо проблема с вектором CStrings?

Какой лучше? Каковы за и против каждого?

Примеры

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;

Строковый ресурс к wstring

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

GetProfileString () возвращает CString.

целое число к формату строки:

wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
7
задан Vanwaril 12 February 2011 в 02:45
поделиться

3 ответа

std::basic_string<> (вернее, его специализация) ужасно работает, это imo один из главных недостатков STL (а я бы сказал С++ вообще). Он даже не знает о кодировках - да ладно, это же 2010 год. Недостаточно уметь определить размер своего персонажа, потому что в строке basic_string<> невозможно указать символы переменного размера. Сейчас utf-8 не очень приятно работать с CString, но это не так плохо, как пытаться делать это с помощью basic_string. Хотя я согласен с духом вышеприведенных плакатов, что стандартное решение лучше, чем альтернативы, CString (если в вашем проекте все равно используется MFC или ATL) гораздо приятнее для работы, чем std::string/wstring: преобразования между ANSI/Unicode (через CStringA и CStringW), BSTR, загрузка из строковой таблицы, операторы кастинга в TCHAR(. c_str()? really?), ...

CString также имеет функцию Format(), которая, хотя и не безопасна и несколько уродлива, но удобна. Если вы предпочитаете безопасные библиотеки форматирования, то лучше использовать basic_string.

Кроме того, в CString в качестве функций-членов есть некоторые алгоритмы, для которых вам понадобятся утилиты boost string, такие как trim, split и т.д.

Векторы CString не представляют проблемы.

Защита от догматического отклонения CString на том основании, что он только для Windows: если вы используете его в графическом интерфейсе Windows, то приложение в любом случае только для Windows. При этом, если есть вероятность, что в будущем ваш код должен быть кроссплатформенным, то вы застрянете с basic_string<>.

10
ответ дан 6 December 2019 в 08:14
поделиться

Лично я бы выбрал CStrings в данном случае, так как вы заявляете, что работаете с BSTRs, используя COM, и пишете это в MFC. В то время как wstrings будут более совместимы со стандартами, у вас возникнут проблемы с постоянным преобразованием из одного в другой. Так как вы работаете с COM и записываете его в MFC, нет никаких реальных причин беспокоиться о том, чтобы сделать его кроссплатформенным, так как ни одна другая ОС не имеет COM как Windows и MFC уже блокирует вас в Windows.

Как вы отметили, CStrings также имеют встроенные функции, чтобы помочь загрузить строки и преобразовать в BSTRs и т.п., все готово и уже построено для работы с Windows. Так что, хотя вам нужно стандартизировать один формат, почему бы не упростить работу с ним?

.
9
ответ дан 6 December 2019 в 08:14
поделиться

std::wstring будет гораздо более переносимым и выиграет от большого количества уже написанного кода в STL и в boost. CString, вероятно, будет лучше с windows API.

wchat_t : помните, что вы можете получить данные из wstring в любое время с помощью функции data(), так что вы получите нужный указатель wchar_t в любом случае.

BSTR : используйте SysAllocString, чтобы получить BSTR из wstring. data().

Что касается платформенной зависимости, помните, что вы можете использовать std::basic_string, чтобы определить свою собственную строку, основываясь на том, какой длиной должен быть одиночный символ.

Я бы выбрал wstring каждый день....

.
3
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: