我有一个简单bi_map
的双向映射类的工作代码,用于在两个方向上存储关联的键值对。我目前的用法是,NID
是某种数字 ID 或枚举,OBJ
而是昂贵的不可复制的类对象。
最近,我注意到我也需要bi_map<NID,std::string>
,是一个真正应该被复制std::string
的便宜。OBJ
概括下面的代码的正确方法是什么,以便用户可以指示某些东西是昂贵的(我想使用指针/引用)还是便宜的(我想按值复制所有内容),以便我可以使用正确的实现?
代码
template<typename NID,typename OBJ>
class bi_map
{
std::map<NID,OBJ*> m_nid_2_ptr;
std::map<OBJ const*,NID> m_ptr_2_nid;
public:
void insert( NID nid, OBJ& obj )
{
m_nid_2_ptr.insert( std::make_pair( nid, &obj ));
m_ptr_2_nid.insert( std::make_pair( &obj, nid ));
}
NID operator[]( OBJ const& obj ) const
{
return m_ptr_2_nid.at( &obj );
}
OBJ const& operator[]( NID nid ) const
{
return *(m_nid_2_ptr.at( nid ));
}
using pairs_cb = std::function<void(NID,OBJ const&)>;
void pairs( pairs_cb cb ) const
{
for( const auto& p : m_nid_2_ptr )
cb( p.first, *p.second );
}
size_t size() const { return m_nid_2_ptr.size(); }
};