在C 中参考返回的参数中积累事物是一种气味吗?

Is it a smell to accumulate things in a parameter returned by reference in C++?

本文关键字:一种 返回 参考 参数      更新时间:2023-10-16

我有以下映射类:

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];
}

作为一般规则,您应该假设对象贴图对象将超过呼叫者的范围。返回的参考来自我们自己的对象数据,因此,只要呼叫者遵循规则,就不应该存在终生问题。

如果您打算使用返回的地图长时间(超过几毫秒:) 在多线程应用程序中地图相反,为了最大程度地减少数据结构在锁定的时间,并"对"地图数据的任何更改进行"交易"。

相关文章: