如何在std :: unordered_map <std :: wstring,T>中通过类型为std :: wstring_view的键找到?

Ale*_*sky 7 c++ c++17

我有

std::unordered_map<std::wstring, std::vector<unsigned>> map;
Run Code Online (Sandbox Code Playgroud)

当我尝试

map.find("asdf"sv)
Run Code Online (Sandbox Code Playgroud)

我明白了

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>> &'
Run Code Online (Sandbox Code Playgroud)

有没有可能使用std :: wstring_view编译map.find()或至少在不构造std :: wstring的情况下进行搜索?

Bar*_*rry 7

您要做的事情称为"异构查找"(基本上,地图的类型和您尝试用于查找的类型是不同的类型).在C++ 20中,由于P0919,我们将获得新的重载,unordered_map::find()这将允许你尝试做的工作.

在此之前,唯一相关的重载特别是a Key const&.而basic_string从构造函数basic_string_viewexplicit (见#10).所以在C++ 17中,你必须写:

map.find("asdf"s)
Run Code Online (Sandbox Code Playgroud)

要么

map.find(std::string("asdf"sv));
Run Code Online (Sandbox Code Playgroud)