From 33abccf8476cb6e4f330a3728ffd61fe24e5fb39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= <theo@tanker.io>
Date: Tue, 8 Nov 2016 13:16:14 +0100
Subject: [PATCH] add template arguments for JSONSerializer

---
 src/json.hpp | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index 8dc9b383..bd59e83b 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -214,8 +214,9 @@ inline namespace
   constexpr auto const& from_json = _static_const<detail::from_json_fn>::value;
 }
 
-// default JSONSerializer template argument
+// default JSONSerializer template argument, doesn't care about template argument
 // will use ADL for serialization
+template <typename = void, typename = void>
 struct adl_serializer
 {
   template <typename T, typename Json, typename = enable_if_t<std::is_default_constructible<uncvref_t<T>>::value>>
@@ -328,7 +329,7 @@ template <
     class NumberUnsignedType = std::uint64_t,
     class NumberFloatType = double,
     template<typename U> class AllocatorType = std::allocator,
-    class JSONSerializer = adl_serializer
+    template<typename T, typename SFINAE = void> class JSONSerializer = adl_serializer
     >
 class basic_json
 {
@@ -1398,9 +1399,9 @@ class basic_json
     }
 
     // constructor chosen when JSONSerializer::to_json exists for type T
-    template <typename T, typename = decltype(JSONSerializer::to_json(std::declval<uncvref_t<T>>()))>
+    template <typename T, typename = decltype(JSONSerializer<uncvref_t<T>>::to_json(std::declval<uncvref_t<T>>()))>
     explicit basic_json(T &&val)
-        : basic_json(JSONSerializer::to_json(std::forward<T>(val))) {}
+        : basic_json(JSONSerializer<uncvref_t<T>>::to_json(std::forward<T>(val))) {}
 
     /*!
     @brief create a string (explicit)
@@ -3072,10 +3073,10 @@ class basic_json
     }
 
     template <typename ValueType, typename = enable_if_t<std::is_default_constructible<uncvref_t<ValueType>>::value, float>>
-    auto get() const -> remove_reference_t<decltype(JSONSerializer::from_json(*this, std::declval<ValueType&>()), std::declval<ValueType>())>
+    auto get() const -> remove_reference_t<decltype(JSONSerializer<uncvref_t<ValueType>>::from_json(*this, std::declval<ValueType&>()), std::declval<ValueType>())>
     {
       uncvref_t<ValueType> ret;
-      JSONSerializer::from_json(*this, ret);
+      JSONSerializer<uncvref_t<ValueType>>::from_json(*this, ret);
       return ret;
     }