跳转至

Json.move_or

template<typename T, typename D = Null>
requires convertible<Json, T> || convertible_map<Json, T, D> || convertible_array<Json, T, D>
T  move_or( T default_result, D default_range_elem = D{} );

尝试将内部数据强制类型转换(移动)为 T 类型,转换失败则返回默认值。

内部进行了充分的编译期类型检查,不可转换的分支会在编译期被排除。 但即使模板可实例化,最后仍可能转换失败,因为 JSON 内部数据类型是运行时的。

注意,一旦移动函数成功,即使没有对象接受此内容,原始数据也会被清空。

建议进行移动后,重置原始对象。

转换规则

  1. Null -> Null
  2. Object -> Object (移动)
  3. Array -> Array (移动)
  4. String -> String (移动)
  5. Bool -> Bool
  6. Number -> 枚举类型 (四舍五入至最近的整数)
  7. Number -> 整数类型 (四舍五入至最近的整数)
  8. Number -> 浮点类型
  9. Any -> 提供了 Json 构造函数的类型 (优先移动)
  10. Object -> 可隐式转换的类型(优先移动)
  11. Array -> 可隐式转换的类型(优先移动)
  12. String -> 可隐式转换的类型(优先移动)
  13. Number -> 可隐式转换的类型
  14. Bool -> 可隐式转换的类型
  15. Null -> 可隐式转换的类型 (Null 不能隐式转换为 bool !)
  16. Object -> 尝试复制到类型的可转换键值对类型(只需要内部元素可转换)(优先移动)
  17. Array -> 尝试复制到类型的可转换数组类型(只需要内部元素可转换)(优先移动)
  18. return default_result;

参数

  • T 需要转换成的目标类型
  • default_result 转换失败时返回的默认值
  • default_range_elem 转成成数组或键值对类型时,子元素转换失败时的填充值(转换目标不是数组和对象时无需填写)

异常

函数进行了编译器类型检查,通常不会出现异常。

对于复杂类型和自定义类型的转换,涉及内存分配和自定义构造函数,可能会抛出异常,本函数不会处理,异常会直接抛出。

复杂度

线性或常数。

版本

v0.8.0 至今。