В коде, который вставляет OLE-строки в стиле Windows (BSTR
) в хороший старый STL-контейнер - unordered_map<BSTR>
, я объявил unordered_set
, например:
unordered_set<BSTR, std::hash<std::wstring>, std::equal_to<std::wstring>> usetBstr;
ожидает, что BSTR
строки будут действовать как wstring
с.
Все, казалось, работало нормально, пока однажды BSTR
с нулем wchar
в середине строки не был вставлен в unordered_set
.
Конечно !, когда компилятор преобразует BSTR
в std::wstring
, он останавливается на первом нулевом терминаторе, найденном в строке, потому что wstring
на самом деле не являются BSTR
строками (которые сохраняют свои длина в слове памяти, непосредственно предшествующем данным BSTR, и wstring
s сохраняют их длину где-нибудь еще).
Вопрос : Какие функции Hash
и EqualTo
из библиотеки STL подойдут для unordered_map<BSTR>
в этом случае?
P.S. Конечно, я мог бы развернуть свои собственные функции, но я предпочитаю свернуть что-то уже в стандарте.