Json.move_if
template<typename T, typename D = Null>
requires convertible<Json, T> || convertible_map<Json, T, D> || convertible_array<Json, T, D>
std::optional<T> move_if( D default_range_elem = D{} );
尝试将内部数据强制类型转换(移动)为 T
类型,如果转换失败则返回 std::nullopt
。
内部进行了充分的编译期类型检查,不可转换的分支会在编译期被排除。 但即使模板可实例化,最后仍可能转换失败,因为 JSON 内部数据类型是运行时的。
注意,一旦移动函数成功,即使没有对象接受此内容,原始数据也会被清空。
建议进行移动后,重置原始对象。
转换规则
- Null -> Null
- Object -> Object (移动)
- Array -> Array (移动)
- String -> String (移动)
- Bool -> Bool
- Number -> 枚举类型 (四舍五入至最近的整数)
- Number -> 整数类型 (四舍五入至最近的整数)
- Number -> 浮点类型
- Any -> 提供了 Json 构造函数的类型 (优先移动)
- Object -> 可隐式转换的类型(优先移动)
- Array -> 可隐式转换的类型(优先移动)
- String -> 可隐式转换的类型(优先移动)
- Number -> 可隐式转换的类型
- Bool -> 可隐式转换的类型
- Null -> 可隐式转换的类型 (Null 不能隐式转换为 bool !)
- Object -> 尝试复制到类型的可转换键值对类型(只需要内部元素可转换)(优先移动)
- Array -> 尝试复制到类型的可转换数组类型(只需要内部元素可转换)(优先移动)
- return std::nullopt;
参数
T
需要转换成的目标类型default_range_elem
转成成数组或键值对类型时,子元素转换失败时的填充值(转换目标不是数组和对象时无需填写)
异常
函数进行了编译器类型检查,通常不会出现异常。
对于复杂类型和自定义类型的转换,涉及内存分配和自定义构造函数,可能会抛出异常,本函数不会处理,异常会直接抛出。
复杂度
线性或常数。
版本
v0.8.0 至今。