我有以下映射类:
class ObjectMapper {
public:
std::map<uint32_t, uint32_t>& getMappingForObject(
Object* object);
private:
std::unordered_map<Object*, std::map<uint32_t, uint32_t>> m_objMapping;
};
其实现就是这样:
std::map<uint32_t, uint32_t>& ObjectMapper::getMappingForObject(
Object* object) {
const auto mappingTableIterator = m_objMapping.find(object);
if (mappingTableIterator == m_objMapping.end()) {
auto it = m_objMapping.emplace(object,
std::map<uint32_t, uint32_t>());
return it.first->second;
}
return mappingTableIterator->second;
}
因此,呼叫者可以这样做:
std::map<uint32_t, uint32_t>& mappingTable =
objMapper.getMappingForObject(object);
继续并添加/删除mappingTable
中的内容。
这是C 的好模式吗?我觉得这是使用参考输出参数通过所有权,这是一种气味,但我不确定。还有更好的选择吗?
以简单的术语重写您的功能,只要呼叫者不存储结果以供以后使用并知道更改地图将使参考无效。让我们回到这个...
您的原始功能可以被重写为:
std::map<uint32_t, uint32_t>& ObjectMapper::getMappingForObject(Object* object)
{
if (m_objMapping.count(object) == 0)
{
// a new object, remove test if nothing special needs to be done.
}
return m_objMapping[object];
}
作为一般规则,您应该假设对象贴图对象将超过呼叫者的范围。返回的参考来自我们自己的对象数据,因此,只要呼叫者遵循规则,就不应该存在终生问题。
。如果您打算使用返回的地图长时间(超过几毫秒:) 或在多线程应用程序中地图相反,为了最大程度地减少数据结构在锁定的时间,并"对"地图数据的任何更改进行"交易"。