From a75af7352127c261baf0b6cca5cb823e13e78f11 Mon Sep 17 00:00:00 2001 From: Derek Bailey Date: Mon, 23 Jul 2018 22:51:42 -0700 Subject: [PATCH] Added preprocessor define for C++ if Template Aliases are supported by the compiler --- include/flatbuffers/stl_emulation.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/include/flatbuffers/stl_emulation.h b/include/flatbuffers/stl_emulation.h index 7e7e978a4..f2689a9e1 100644 --- a/include/flatbuffers/stl_emulation.h +++ b/include/flatbuffers/stl_emulation.h @@ -68,14 +68,20 @@ inline void vector_emplace_back(std::vector *vector, V &&data) { #endif // defined(FLATBUFFERS_CPP98_STL) } +// Check if we can use template aliases +#if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) \ + && (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) + #define FLATBUFFERS_TEMPLATES_ALIASES +#endif + #ifndef FLATBUFFERS_CPP98_STL - #if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using numeric_limits = std::numeric_limits; #else template class numeric_limits : public std::numeric_limits {}; - #endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #else template class numeric_limits : public std::numeric_limits {}; @@ -98,7 +104,7 @@ inline void vector_emplace_back(std::vector *vector, V &&data) { }; #endif // FLATBUFFERS_CPP98_STL -#if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) +#if defined(FLATBUFFERS_TEMPLATES_ALIASES) #ifndef FLATBUFFERS_CPP98_STL template using is_scalar = std::is_scalar; template using is_same = std::is_same; @@ -119,10 +125,10 @@ inline void vector_emplace_back(std::vector *vector, V &&data) { template struct is_floating_point : public std::is_floating_point {}; template struct is_unsigned : public std::is_unsigned {}; -#endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) +#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #ifndef FLATBUFFERS_CPP98_STL - #if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using unique_ptr = std::unique_ptr; #else // MSVC 2010 doesn't support C++11 aliases. @@ -148,7 +154,7 @@ inline void vector_emplace_back(std::vector *vector, V &&data) { return std::unique_ptr::operator=(p); } }; - #endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #else // Very limited implementation of unique_ptr. // This is provided simply to allow the C++ code generated from the default