1
0
mirror of https://github.com/nlohmann/json.git synced 2025-07-15 07:41:50 +03:00

Added get_ref()

Same as get_ptr() but for references.
If the type is incompatible it throws (get_ptr() returns null).
Implemented in terms of get_ptr().
This commit is contained in:
dariomt
2015-10-16 15:23:57 +02:00
parent 8f97e99feb
commit bd2783f45c
3 changed files with 273 additions and 2 deletions

View File

@ -2251,6 +2251,19 @@ class basic_json
return is_number_float() ? &m_value.number_float : nullptr;
}
/// helper function to implement get_ref without code duplication
/// for const and non-const overloads
/// ThisType will be deduced as 'basic_jason' or 'const basic_json'
template<typename ReferenceType, typename ThisType>
static ReferenceType get_ref_impl(ThisType& obj)
{
using PointerType = std::add_pointer<ReferenceType>::type;
// delegate the call to get_ptr<>()
auto ptr = obj.get_ptr<PointerType>();
if (ptr) return *ptr;
throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + obj.type_name());
}
public:
/// @name value access
@ -2387,10 +2400,56 @@ class basic_json
std::is_pointer<PointerType>::value
and std::is_const< typename std::remove_pointer<PointerType>::type >::value
, int>::type = 0>
const PointerType get_ptr() const noexcept
PointerType get_ptr() const noexcept
{
// delegate the call to get_impl_ptr<>() const
return get_impl_ptr(static_cast<const PointerType>(nullptr));
return get_impl_ptr(static_cast<PointerType>(nullptr));
}
/*!
@brief get a reference value (implicit)
Implict reference access to the internally stored JSON value. No copies are
made.
@warning Writing data to the referee of the result yields an undefined
state.
@tparam ReferenceType reference type; must be a reference to @ref array_t, @ref
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref
number_float_t.
@return reference to the internally stored JSON value if the requested reference
type @a ReferenceType fits to the JSON value; throws std::domain_error otherwise
@throw std::domain_error in case passed type @a ReferenceType is incompatible
with the stored JSON value
@complexity Constant.
*/
template<typename ReferenceType, typename
std::enable_if<
std::is_reference<ReferenceType>::value
, int>::type = 0>
ReferenceType get_ref()
{
// delegate call to get_ref_impl
return get_ref_impl<ReferenceType>(*this);
}
/*!
@brief get a reference value (implicit)
@copydoc get_ref()
*/
template<typename ReferenceType, typename
std::enable_if<
std::is_reference<ReferenceType>::value
and std::is_const< typename std::remove_reference<ReferenceType>::type >::value
, int>::type = 0>
ReferenceType get_ref() const
{
// delegate call to get_ref_impl
return get_ref_impl<ReferenceType>(*this);
}
/*!