Json.to_if
template<typename T, typename D = Null>
requires convertible<Json, T> || convertible_map<Json, T, D> || convertible_array<Json, T, D>
std::optional<T> to_if( D default_range_elem = D{} ) const;
将内部数据强制类型转换(拷贝)为 T
类型,如果转换失败则返回 std::nullopt
。
内部进行了充分的编译期类型检查,不可转换的分支会在编译期被排除。 但即使模板可实例化,最后仍可能转换失败,因为 JSON 内部数据类型是运行时的。
注意此函数不处理异常,如果因为转换时的构造函数,或复杂类型内存分配失败时抛出异常,此函数同样抛出异常而非返回 std::nullopt
。
转换规则
- 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 至今。