diff --git a/src/json.hpp b/src/json.hpp index 68ac29fc..528c92b2 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -127,6 +127,9 @@ using remove_cv_t = typename std::remove_cv<T>::type; template <typename T> using remove_reference_t = typename std::remove_reference<T>::type; +template <typename T> +using uncvref_t = remove_cv_t<remove_reference_t<T>>; + // TODO update this doc /*! @brief unnamed namespace with internal helper functions @@ -1404,11 +1407,12 @@ class basic_json // auto j = json{{"a", json(not_equality_comparable{})}}; // // we can remove this constraint though, since lots of ctor are not explicit already - template <typename T, typename = enable_if_t<detail::has_json_traits< - remove_cv_t<remove_reference_t<T>>>::value>> + template <typename T, typename = enable_if_t< + detail::has_json_traits<uncvref_t<T>>::value>> explicit basic_json(T &&val) - : basic_json(json_traits<remove_cv_t<remove_reference_t<T>>>::to_json( - std::forward<T>(val))) {} + : basic_json(json_traits<uncvref_t<T>>::to_json(std::forward<T>(val))) + { + } /*! @brief create a string (explicit) @@ -2771,12 +2775,12 @@ class basic_json // get_impl overload chosen if json_traits struct is specialized for type T // simply returns json_traits<T>::from_json(*this); - template <typename T, typename = enable_if_t<detail::has_json_traits< - remove_cv_t<remove_reference_t<T>>>::value>> - auto get_impl(T *) const - -> decltype(json_traits<remove_cv_t<remove_reference_t<T>>>::from_json( - std::declval<basic_json>())) { - return json_traits<remove_cv_t<remove_reference_t<T>>>::from_json(*this); + template <typename T, typename = enable_if_t< + detail::has_json_traits<uncvref_t<T>>::value>> + auto get_impl(T *) const -> decltype( + json_traits<uncvref_t<T>>::from_json(std::declval<basic_json>())) + { + return json_traits<uncvref_t<T>>::from_json(*this); } // this one is quite atrocious @@ -2784,12 +2788,11 @@ class basic_json // I chose to prefer the json_traits specialization if it exists, since it's a more advanced use. // But we can of course change this behaviour template <typename T> - auto get_impl(T *) const - -> enable_if_t<not detail::has_json_traits<remove_cv_t<T>>::value, - remove_cv_t<remove_reference_t<decltype( - ::nlohmann::from_json(std::declval<basic_json>(), + auto get_impl(T *) const -> enable_if_t< + not detail::has_json_traits<remove_cv_t<T>>::value, + uncvref_t<decltype(::nlohmann::from_json(std::declval<basic_json>(), std::declval<T &>()), - std::declval<T>())>>> + std::declval<T>())>> { remove_cv_t<T> ret; // I guess this output parameter is the only way to get ADL