ZBLOG

template T getCachedValue(const std::string& key) { if (cacheMap.contains(key)) { return std::visit([&](auto&& arg) { using Type = std::decay_t; if con...

这段代码实现了一个模板函数 getCachedValue,用于从缓存中获取指定类型的值。以下是对代码的分析和改进建议:

代码分析:

  1. 功能

    • 根据给定的 keycacheMap 中查找对应的值。
    • 如果找到且类型匹配,返回该值;否则返回默认构造的 T{} 或抛出异常。
    • std::string 类型有特殊处理(返回 "na")。
  2. 关键点

    • 使用了 C++17 的 std::visit + if constexpr 进行类型安全访问。
    • 通过 SFINAE (requires) 检查类型是否可默认构造。
  3. 潜在问题

    • cacheMap[key] 可能触发不必要的插入操作(如果是 std::map)。
    • std::string("na") 的硬编码可能不符合所有场景需求。

改进建议版本:

  1. template <typename T>
  2. T getCachedValue(const std::string& key)
  3. {
  4. // Use find() to avoid accidental insertion
  5. auto it = cacheMap.find(key);
  6. if (it != cacheMap.end())
  7. {
  8. return std::visit([&](auto&& arg) -> T {
  9. using Type = std::decay_t<decltype(arg)>;
  10. if constexpr (std::is_same_v<Type, T>)
  11. {
  12. return arg; // Exact type match
  13. }
  14. else if constexpr (std::is_constructible_v<T, Type>)
  15. {
  16. return static_cast<T>(arg); // Allow implicit conversions
  17. }
  18. else
  19. {
  20. if constexpr (std::is_default_constructible_v<T>)
  21. {
  22. return T{}; // Fallback to default
  23. }
  24. throw std::runtime_error("Type mismatch and no fallback");
  25. }
  26. }, it->second);
  27. }
  28. // Handle missing key cases
  29. if constexpr (std::is_same_v<T, std::string>)
  30. {
  31. return "na"; // NRVO optimization
  32. }
  33. else if constexpr (std::is_default_constructible_v<T>)
  34. {
  35. return T{};
  36. }
  37. throw std::runtime_error("Key not found and type is not default-constructible");
  38. }

改进点说明:

  1. 避免意外插入

    • 使用 .find() 替代 .contains() + operator[],防止查询时修改 map。
  2. 增强类型兼容性

    • 添加了 std::is_constructible_v<T, Type>,支持隐式转换(如 int -> float)。
  3. 优化错误处理

    • 明确区分 “type mismatch”(类型不匹配)和 “key not found”(键不存在)的错误场景。
  4. 性能优化

    • NRVO(Named Return Value Optimization)适用于字符串返回。
  5. 扩展性

    • 可通过模板特化或策略模式自定义默认值逻辑。

使用示例:

  1. // Assume cacheMap holds variant<int, double, string>
  2. auto v1 = getCachedValue<int>("count"); // Exact match
  3. auto v2 = getCachedValue<float>("price"); // int -> float conversion
  4. auto v3 = getCachedValue<std::string>("id");// Returns "na" if missing

如果需要进一步定制行为(如日志记录、自定义默认值),可以考虑将其扩展为策略类模板。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23457

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?