diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 2f15073..0a45a15 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -40,6 +40,16 @@ // For placement new #include +// c++17 and more detection for std::from_chars +#if (!defined(PUGIXML_HAS_CXX17)) && ((__cplusplus >= 201703L) || \ + (defined(_MSC_VER) && _MSC_VER >= 1911 && _MSVC_LANG >= 201703L)) +# define PUGIXML_HAS_CXX17 +#endif + +#if defined(PUGIXML_HAS_CXX17) +# include +#endif + #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable: 4127) // conditional expression is constant @@ -4611,6 +4621,10 @@ PUGI_IMPL_NS_BEGIN { #ifdef PUGIXML_WCHAR_MODE return wcstod(value, 0); + #elif defined(PUGIXML_HAS_CXX17) + double result_double = 0.0; + std::from_chars(value, (value + strlen(value)), result_double); + return result_double; #else return strtod(value, 0); #endif @@ -4620,6 +4634,10 @@ PUGI_IMPL_NS_BEGIN { #ifdef PUGIXML_WCHAR_MODE return static_cast(wcstod(value, 0)); + #elif defined(PUGIXML_HAS_CXX17) + double result_double = 0.0; + std::from_chars(value, value + strlen(value), result_double); + return static_cast(result_double); #else return static_cast(strtod(value, 0)); #endif @@ -8554,6 +8572,10 @@ PUGI_IMPL_NS_BEGIN // parse string #ifdef PUGIXML_WCHAR_MODE return wcstod(string, 0); + #elif defined(PUGIXML_HAS_CXX17) + double result_double = 0.0; + std::from_chars(string, string + strlen(string), result_double); + return static_cast(result_double); #else return strtod(string, 0); #endif