我有一个简单的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