[/ Copyright (c) 2022 Dmitry Arkhipov (grisumbras@yandex.ru) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Official repository: https://github.com/cppalliance/json ] [/-----------------------------------------------------------------------------] [section Non-throwing conversions] For the case where throwing exceptions is undesirable, Boost.JSON also provides a non-throwing version of __value_to__, the function template __try_value_to__. It returns __result__, a specialised variant that either holds a value or an __error_code__. [note There's no non-throwing equivalent for __value_from__. This is simply because we haven't yet encountered a situation where __value_from__ needed to communicate an error to the caller.] The library provides non-throwing conversions for all the categories of types it supports with __value_to__. If a user wants to use it with custom types, an overload of `tag_invoke` of this form needs to be provided: ``` result_for::type tag_invoke( const try_value_to_tag< T >&, const value& ); ``` For the class `ip_address` from the section [link json.conversion.custom_conversions Custom conversions] this overload may look like this: [snippet_nothrow_1] The overload lets us use `ip_address` with __try_value_to__. [snippet_nothrow_2] If __try_value_to__ is used with a type, for which there's no `tag_invoke` overload of the form described in this section, but there is one of the form intended for __value_to__, then the library still tries to perform the conversion. It uses the throwing overload, and attempts to convert any thrown exception into an __error_code__. Note, though, that such approach will likely be slower then a dedicated overload. The opposite is also true: if there's a `tag_invoke` overload intended for __try_value_to__, but not for __value_to__, then calling `__value_to__` will invoke the non-throwing overload, then construct a __system_error__ from the __error_code__ and throw it. Due to these fallbacks, it is recommended that users provide the overload from this section, rather then the other one, if they ever intend to use __try_value_to__. [endsect]