У меня есть следующий код в C++ на Win32. Это просто C++ перекос на некоторых Win32 API, который возвращает CHAR *
:Инициировать std :: string с одной копией
wstring expandEnvironmentVariables(const wstring & str)
{
DWORD neededSize = ExpandEnvironmentStrings(str.c_str(), nullptr, 0);
vector<WCHAR> expandedStr(neededSize);
if (0 == ExpandEnvironmentStrings(str.c_str(), expandedStr.data(), static_cast<DWORD>(expandedStr.size()))) {
return wstring(str);
}
return wstring(expandedStr.data());
}
Что беспокоит меня об этом коде, является двойной копией результата.
- по API в вектор
WCHAR
s. - от вектора до
std::wstring
.
Есть ли способ реализовать этот код только с одной копией и без существенного изменения подписи функции. Это конкретный пример, но меня больше интересует общее решение и правильный способ работы с std::wstring
/std::string
, потому что этот шаблон проявляется во многих местах кода.
@ Энже: Добро пожаловать. Я тоже был уверен, что однажды обнаружил упущение. Это странно. –
Обычно я предпочитаю 'front' вместо' & s [0] '. Он работает даже в контейнерах типа 'list'. – edmz
Но зачем вам указатель на первый узел в «списке»? –