我有一個簡單的bi_map
的工作代碼,這是一個雙向映射類,用於在兩個方向上存儲關聯的鍵值對。我目前的用法是,NID
是某種數字編號或枚舉,而OBJ
是一個昂貴的不可複製的類對象。如何表示昂貴的與便宜的模板參數?
最近,我注意到我也需要bi_map<NID,std::string>
,std::string
是一個便宜的OBJ
應該真的只是複製。
什麼是正確的方式來概括下面的代碼,以便用戶可以發信號是否有東西是昂貴的(我想使用指針/引用)或廉價(我想複製一切的價值),以便我可以使用正確的實施?
CODE
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(); }
};
template? –
默認情況下進行復制。使用'bi_map <...,unique_ptr>'爲昂貴的副本? (或其他一些跟蹤指針的包裝類型) –
Pubby
@Pubby +1我只是嘗試了一個簡單,薄的'my_namespace :: ref <>'可複製包裝器,它工作得很棒。它不僅對我的'bi_map <>'有用,而且可以在任何時候需要在任何基於值的(STL)容器中存儲引用時使用它。最重要的是,它是出色的分離問題:我可以保留所有基於容器的值,從而使代碼更簡單,更易於維護。謝謝! – kfmfe04