Как выполнить get_map_or_default, например, python dict.get - PullRequest
0 голосов
/ 11 января 2019

Я хочу написать функцию для получения значения ключа в std::map, и, если ключ отсутствует в карте, вернуть значение по умолчанию, очень похожее на dict.get(key, default).

в Python.

Итак, я написал:

template <class K, class V>
const V& GetMapValueOrDefault(const typename std::map<K, V>& map_, const K& k, const V& default_)
{
    auto it = map_.find(k);
    if (it == map_.end())
        return default_;
    return it->second;
}

Это работает до тех пор, пока я не запущу следующий код:

std::map<int, ClassA> map_;  // map_ no contains key 1
const auto &value = GetMapValueOrDefault(map_, 1, ClassA());
// value.blablabla

Я получаю ошибку, потому что GetMapValueOrDefault возвращает временную переменную, на которую ссылается value, и затем временная переменная уничтожается. Так что value является недействительной ссылкой.

Как правильно написать эту функцию?

Я не хочу GetMapValueOrDefault(..., V default_), потому что иногда копия не нужна.

1 Ответ

0 голосов
/ 11 января 2019

Вы можете принудительно указать, что default_ не является временным, сделав его изменяемой ссылкой.

template <class K, class V>
const V& GetMapValueOrDefault(const typename std::map<K, V>& map_, const K& k, V& default_)
{
    auto it = map_.find(k);
    if (it == map_.end())
        return default_;
    return it->second;
}
...