我有以下代码:
#include <boost/bimap/bimap.hpp>
#include <boost/bimap/unordered_multiset_of.hpp>
#include <string>
using namespace boost::bimaps;
using namespace boost;
struct Example
{
uint64_t id;
};
struct ExampleHash
{
uint64_t operator()(const Example& item) const
{
return item.id;
}
uint64_t operator()(const uint64_t item) const
{
return item;
}
};
struct ExampleEq
{
bool operator()(const Example& l, const Example& r) const
{
return l.id == r.id;
}
bool operator()(const uint64_t l, const Example& r) const
{
return l == r.id;
}
bool operator()(const Example& l, const uint64_t r) const
{
return operator()(r, l);
}
};
using BM = bimaps::bimap<
unordered_multiset_of<std::string>,
unordered_multiset_of<Example, ExampleHash, ExampleEq>
>;
int main() {
BM bm;
bm.insert(BM::value_type("First", Example{1}));
auto it = bm.right.find(1u);
return 0;
}
根据boost文档
template< class CompatibleKey >
iterator find(const CompatibleKey & x);
如果 (CompatibleKey, Hash, Pred) 是 (Hash, Pred) 的兼容扩展,则称类型 CompatibleKey 是 (Hash, Pred) 的兼容键。这意味着 Hash 和 Pred 接受 CompatibleKey 类型的参数,这通常意味着它们有几个对应的 operator() 成员函数的重载。
所以我认为这auto it = bm.right.find(1u);
会奏效。不幸的是,这会产生编译错误:
error: no match for call to (boost::bimaps::container_adaptor::detail::key_to_base_identity<Example, const Example>) (const long unsigned int&)
我的问题是,是否甚至可以使用与 bimap 键类型不同类型的 CompatibleKey?我已经尝试过提升标题,不幸的是,实现太复杂了,我无法理解发生了什么。