diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-07-16 13:17:06 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-07-16 13:17:06 +0200 |
commit | 338d2ec42b99a17f4fa1759f27bf8735b4aea974 (patch) | |
tree | f1bf1ff3bbdeae2341373df6550ce3ca2e1e19ea /Eigen/src/Core/util/Meta.h | |
parent | 0a945687b73cfe139c65ac2b5b001ee3dcc3c5d0 (diff) |
bug #826: fix is_convertible for MSVC and add minimalistic unit test for is_convertible
Diffstat (limited to 'Eigen/src/Core/util/Meta.h')
-rw-r--r-- | Eigen/src/Core/util/Meta.h | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index 795197f59..b99b8849e 100644 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -82,22 +82,31 @@ template<typename T> struct add_const_on_value_type<T const* const> { typedef T template<typename From, typename To> -struct is_convertible +struct is_convertible_impl { private: + struct any_conversion + { + template <typename T> any_conversion(const volatile T&); + template <typename T> any_conversion(T&); + }; struct yes {int a[1];}; struct no {int a[2];}; - - template<typename T> - static yes test (const T&) {} - - template<typename> static no test (...) {} + + static yes test(const To&, int); + static no test(any_conversion, ...); public: static From ms_from; - enum { value = sizeof(test<To>(ms_from))==sizeof(yes) }; + enum { value = sizeof(test(ms_from, 0))==sizeof(yes) }; }; +template<typename From, typename To> +struct is_convertible +{ + enum { value = is_convertible_impl<typename remove_all<From>::type, + typename remove_all<To >::type>::value }; +}; /** \internal Allows to enable/disable an overload * according to a compile time condition. |