From e7d8ba747c7b161eff59959d4d2a5acf788ee00e Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Thu, 10 Oct 2019 17:41:47 +0200 Subject: [PATCH] bug #1752: make is_convertible equivalent to the std c++11 equivalent and fallback to std::is_convertible when c++11 is enabled. --- Eigen/src/Core/util/Meta.h | 13 +++++++++++++ test/meta.cpp | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index db948cea19..fe9550d71f 100755 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -174,6 +174,11 @@ template struct add_const_on_value_type { typedef T const template struct add_const_on_value_type { typedef T const* const type; }; template struct add_const_on_value_type { typedef T const* const type; }; +#if EIGEN_HAS_CXX11 + +using std::is_convertible; + +#else template struct is_convertible_impl @@ -211,6 +216,14 @@ struct is_convertible enum { value = is_convertible_impl::value }; }; +template +struct is_convertible { enum { value = false }; }; + +template +struct is_convertible { enum { value = true }; }; + +#endif + /** \internal Allows to enable/disable an overload * according to a compile time condition. */ diff --git a/test/meta.cpp b/test/meta.cpp index 51395acd06..b432d93161 100644 --- a/test/meta.cpp +++ b/test/meta.cpp @@ -87,8 +87,12 @@ EIGEN_DECLARE_TEST(meta) STATIC_CHECK(( internal::is_convertible::value )); STATIC_CHECK((!internal::is_convertible::value )); STATIC_CHECK((!internal::is_convertible::value )); - STATIC_CHECK(( internal::is_convertible::value )); // std::is_convertible returns false here though Matrix3f from; Matrix3f& to = from; is valid. - //STATIC_CHECK((!internal::is_convertible::value )); //does not work because the conversion is prevented by a static assertion + STATIC_CHECK(!( internal::is_convertible::value )); + + STATIC_CHECK(!( internal::is_convertible::value )); + STATIC_CHECK(( internal::is_convertible::value )); + + //STATIC_CHECK((!internal::is_convertible::value )); //does not even compile because the conversion is prevented by a static assertion STATIC_CHECK((!internal::is_convertible::value )); STATIC_CHECK((!internal::is_convertible::value )); {