bug #1752: make is_convertible equivalent to the std c++11 equivalent and fallback to std::is_convertible when c++11 is enabled.

This commit is contained in:
Gael Guennebaud 2019-10-10 17:41:47 +02:00
parent fb557aec5c
commit e7d8ba747c
2 changed files with 19 additions and 2 deletions

View File

@ -174,6 +174,11 @@ template<typename T> struct add_const_on_value_type<T*> { typedef T const
template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
#if EIGEN_HAS_CXX11
using std::is_convertible;
#else
template<typename From, typename To>
struct is_convertible_impl
@ -211,6 +216,14 @@ struct is_convertible
enum { value = is_convertible_impl<From,To>::value };
};
template<typename T>
struct is_convertible<T,T&> { enum { value = false }; };
template<typename T>
struct is_convertible<const T,const T&> { enum { value = true }; };
#endif
/** \internal Allows to enable/disable an overload
* according to a compile time condition.
*/

View File

@ -87,8 +87,12 @@ EIGEN_DECLARE_TEST(meta)
STATIC_CHECK(( internal::is_convertible<const Matrix3f&,const Matrix3f&>::value ));
STATIC_CHECK((!internal::is_convertible<const Matrix3f&,Matrix3f&>::value ));
STATIC_CHECK((!internal::is_convertible<const Matrix3f,Matrix3f&>::value ));
STATIC_CHECK(( internal::is_convertible<Matrix3f,Matrix3f&>::value )); // std::is_convertible returns false here though Matrix3f from; Matrix3f& to = from; is valid.
//STATIC_CHECK((!internal::is_convertible<Matrix3f,Matrix3d>::value )); //does not work because the conversion is prevented by a static assertion
STATIC_CHECK(!( internal::is_convertible<Matrix3f,Matrix3f&>::value ));
STATIC_CHECK(!( internal::is_convertible<int,int&>::value ));
STATIC_CHECK(( internal::is_convertible<const int,const int& >::value ));
//STATIC_CHECK((!internal::is_convertible<Matrix3f,Matrix3d>::value )); //does not even compile because the conversion is prevented by a static assertion
STATIC_CHECK((!internal::is_convertible<Array33f,int>::value ));
STATIC_CHECK((!internal::is_convertible<MatrixXf,float>::value ));
{