我想编写一个函数来获取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_)
,因为有时不需要副本。
答案 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;
}