У меня есть приложение 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);
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<>.
Лично я бы выбрал CString
s в данном случае, так как вы заявляете, что работаете с BSTR
s, используя COM, и пишете это в MFC. В то время как wstring
s будут более совместимы со стандартами, у вас возникнут проблемы с постоянным преобразованием из одного в другой. Так как вы работаете с COM и записываете его в MFC, нет никаких реальных причин беспокоиться о том, чтобы сделать его кроссплатформенным, так как ни одна другая ОС не имеет COM как Windows и MFC уже блокирует вас в Windows.
Как вы отметили, CString
s также имеют встроенные функции, чтобы помочь загрузить строки и преобразовать в BSTR
s и т.п., все готово и уже построено для работы с Windows. Так что, хотя вам нужно стандартизировать один формат, почему бы не упростить работу с ним?
std::wstring будет гораздо более переносимым и выиграет от большого количества уже написанного кода в STL и в boost. CString, вероятно, будет лучше с windows API.
wchat_t : помните, что вы можете получить данные из wstring в любое время с помощью функции data(), так что вы получите нужный указатель wchar_t в любом случае.
BSTR : используйте SysAllocString, чтобы получить BSTR из wstring. data().
Что касается платформенной зависимости, помните, что вы можете использовать std::basic_string
, чтобы определить свою собственную строку, основываясь на том, какой длиной должен быть одиночный символ.
Я бы выбрал wstring каждый день....
.