diff --git a/src/json.hpp b/src/json.hpp
index 78cc7093..dece61dc 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -113,10 +113,13 @@ template<typename T>
 struct has_mapped_type
 {
   private:
-    template<typename C> static char test(typename C::mapped_type*);
-    template<typename C> static char (&test(...))[2];
+    template <typename U, typename = typename U::mapped_type>
+    static int detect(U&&);
+
+    static void detect(...);
   public:
-    static constexpr bool value = sizeof(test<T>(0)) == 1;
+    static constexpr bool value =
+        std::is_integral<decltype(detect(std::declval<T>()))>::value;
 };
 
 /*!
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 61196844..4f8adfd3 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -113,10 +113,13 @@ template<typename T>
 struct has_mapped_type
 {
   private:
-    template<typename C> static char test(typename C::mapped_type*);
-    template<typename C> static char (&test(...))[2];
+    template <typename U, typename = typename U::mapped_type>
+    static int detect(U&&);
+
+    static void detect(...);
   public:
-    static constexpr bool value = sizeof(test<T>(0)) == 1;
+    static constexpr bool value =
+        std::is_integral<decltype(detect(std::declval<T>()))>::value;
 };
 
 /*!