有没有办法指定默认值 std::map
的 operator[]
当密钥不存在时返回?
原文由 anon 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法指定默认值 std::map
的 operator[]
当密钥不存在时返回?
原文由 anon 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一种正确的方法,如果调用者将左值引用传递给映射类型,它将有条件地返回引用。
template <typename Map, typename DefVal>
using get_default_return_t = std::conditional_t<std::is_same_v<std::decay_t<DefVal>,
typename Map::mapped_type> && std::is_lvalue_reference_v<DefVal>,
const typename Map::mapped_type&, typename Map::mapped_type>;
template <typename Map, typename Key, typename DefVal>
get_default_return_t<Map, DefVal> get_default(const Map& map, const Key& key, DefVal&& defval)
{
auto i = map.find(key);
return i != map.end() ? i->second : defval;
}
int main()
{
std::map<std::string, std::string> map;
const char cstr[] = "world";
std::string str = "world";
auto& ref = get_default(map, "hello", str);
auto& ref2 = get_default(map, "hello", std::string{"world"}); // fails to compile
auto& ref3 = get_default(map, "hello", cstr); // fails to compile
return 0;
}
原文由 MarkB 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
不,没有。最简单的解决方案是编写自己的免费模板函数来执行此操作。就像是:
C++11 更新
目的:说明通用关联容器,以及可选的比较器和分配器参数。