Json.to_if
template<typename T, typename D = Nul>
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 noexcept;
Converts internal data to type T
(copy) and returns std::optional<T>
. Returns std::nullopt
on conversion failure.
Extensive compile-time type checking ensures incompatible branches are eliminated during compilation.
Note: Runtime conversion may still fail due to JSON's dynamic typing, despite template instantiation being valid.
Important: This function doesn't handle exceptions - allocation errors or constructor exceptions will propagate through.
Conversion Rules
- Nul → Nul
- Obj → Obj
- Arr → Arr
- Str → Str
- Bol → Bol
- Num → Enum (rounded to nearest integer)
- Num → Integer types (rounded)
- Num → Floating-point types
- Any → Types with Json constructors
- Obj → Implicitly convertible types
- Arr → Implicitly convertible types
- Str → Implicitly convertible types
- Num → Implicitly convertible types
- Bol → Implicitly convertible types
- Nul → Implicitly convertible types (except bool)
- Obj → Convertible key-value types (element-wise)
- Arr → Convertible container types (element-wise)
- Returns
std::nullopt
Parameters
T
: Target typedefault_range_elem
: Fallback value for failed element conversions (array/object only)
Exception Safety
No-throw guarantee.
Complexity
Linear time O(n) (full copy required)
Key differences from throwing version:
- Uses optional
instead of exceptions for type failures
- Still propagates allocation/constructor exceptions
- Same conversion rules but returns nullopt instead of throwing runtime_error
Version
Since v3.0.0 .