Как найти по ключу типа std :: wstring_view в std :: unordered_map <std :: wstring, T>? - PullRequest
0 голосов
/ 11 января 2019

у меня

std::unordered_map<std::wstring, std::vector<unsigned>> map;

когда я пытаюсь

map.find("asdf"sv)

Я получаю

error C2664: 'std::_List_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>> std::_Hash<std::_Umap_traits<_Kty,std::vector<unsigned int,std::allocator<unsigned int>>,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::find(const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &) const': cannot convert argument 1 from 'std::wstring_view' to 'const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &'

возможно ли сделать так, чтобы map.find () компилировался с помощью std :: wstring_view или, по крайней мере, осуществлял поиск без создания std :: wstring?

1 Ответ

0 голосов
/ 11 января 2019

То, что вы пытаетесь сделать, называется «разнородным поиском» (в основном тип карты и тип, который вы пытаетесь использовать для поиска, - это разные типы). В C ++ 20 благодаря P0919 мы получим новые перегрузки в unordered_map::find(), которые позволят работать тому, что вы пытаетесь сделать.

До тех пор единственная соответствующая перегрузка требует, в частности, Key const&. И конструктор basic_string из basic_string_view равен explicit (см. # 10). Таким образом, в C ++ 17 у вас есть для записи:

map.find("asdf"s)

или

map.find(std::string("asdf"sv));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...