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(); }
};