Возвращение C ++ const элемента, в зависимости от того, существует ли он - PullRequest
2 голосов
/ 31 мая 2019

У меня есть 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;
    }
}

, но, очевидно, это не так.t только для чтения, поэтому я изменил сигнатуру для возврата объекта, и bool может передаваться по ссылке:

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 Ответ

11 голосов
/ 31 мая 2019

Вы можете вернуть указатель:

// 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&, но сгенерировать исключение при ошибке поиска.

Во всех случаях будьте осторожны, чтобы документировать ожидаемое время жизни результата. В частности, вы должны прокомментировать, какие функции-члены приведут к тому, что эта функция будет признана недействительной. Обычно это будет «любая не const функция», например, как действует std::string::c_str(), пока вы не будете изменять объекты в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...