more SFINAE

This commit is contained in:
Niels 2015-04-03 16:34:39 +02:00
parent ea1046110d
commit 0a96116b0c
2 changed files with 393 additions and 752 deletions

File diff suppressed because it is too large Load diff

View file

@ -54,6 +54,20 @@ iterators allow a ReversibleContainer to be iterated over in reverse.
namespace nlohmann namespace nlohmann
{ {
// Helper to determine whether there's a key_type for T.
// http://stackoverflow.com/a/7728728/266378
template<typename T>
struct has_key_type
{
private:
template<typename C> static char test(typename C::key_type*);
template<typename C> static int test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};
/*! /*!
@brief JSON @brief JSON
@ -809,7 +823,7 @@ class basic_json
template <class T, typename template <class T, typename
std::enable_if< std::enable_if<
std::is_constructible<typename T::key_type, typename object_t::key_type>::value and std::is_constructible<typename T::key_type, typename object_t::key_type>::value and
std::is_constructible<basic_json, typename T::mapped_type>::value, int>::type std::is_constructible<typename T::mapped_type, basic_json>::value, int>::type
= 0> = 0>
inline T get() const inline T get() const
{ {
@ -826,7 +840,8 @@ class basic_json
template <class T, typename template <class T, typename
std::enable_if< std::enable_if<
not std::is_same<T, string_t>::value and not std::is_same<T, string_t>::value and
std::is_constructible<basic_json, typename T::value_type>::value, int>::type not has_key_type<T>::value and
std::is_constructible<typename T::value_type, basic_json>::value, int>::type
= 0> = 0>
inline T get() const inline T get() const
{ {