如何完成类似python dict.get的get_map_or_default

时间:2019-01-11 12:19:42

标签: c++ stdmap

我想编写一个函数来获取std::map中某个键的值,如果该键不在map中,则返回默认值,非常类似于python的dict.get(key, default)

所以我写道:

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 :(得分:1)

您可以通过将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;
}