我有一个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??
}
}
但是现在,如果没有找到密钥,我将无类型返回。
允许用户以只读方式访问(可能是)返回的对象的最佳方法是什么?
答案 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()
一样有效,直到您对字符串进行了变异为止。