安全地返回C ++ const项,具体取决于是否存在

时间:2019-05-31 14:37:48

标签: c++ stl

我有一个std::unordered_map<uint64_t, Object> _map,我想为客户提供一个只读的吸气剂。

最初我想到了这个:

bool foundItem(const uint64_t key, Object& object) const
{
    if(_map.find(key) != _map.end())
    {
        object = _map.at(key);
        return true;
    }
    else
    {
        return false;
    }
}

但是显然这不是只读的,所以我更改了签名以返回对象,并且布尔值可以通过引用传递:

const Object& foundItem(const uint64_t key, bool& found) const
{
    if(_map.find(key) != _map.end())
    {
        found = true;
        return _map.at(key);
    }
    else
    {
        found = false;
        // What can I return here??
    }
}

但是现在,如果没有找到密钥,我将无类型返回。

允许用户以只读方式访问(可能是)返回的对象的最佳方法是什么?

1 个答案:

答案 0 :(得分:12)

您可以返回一个指针:

// Returns nullptr if not found
const Object* getItem(const uint64_t key) const
{
    auto it = _map.find(key);
    if (it == _map.end())
       return nullptr;

    return &it->second;
}

或者您可以返回一个std::optional,或者您可以返回const Object&但在查找失败时引发异常。

在所有情况下,请小心记录结果的预期寿命。特别是,您应该注释哪些成员函数将导致 this 函数的结果无效。通常,这将是“任何非const函数”,就像std::string::c_str()一样有效,直到您对字符串进行了变异为止。