diff options
Diffstat (limited to 'boost/hana/core/to.hpp')
-rw-r--r-- | boost/hana/core/to.hpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/boost/hana/core/to.hpp b/boost/hana/core/to.hpp index 6a6a115b3a..1b54115162 100644 --- a/boost/hana/core/to.hpp +++ b/boost/hana/core/to.hpp @@ -39,27 +39,29 @@ BOOST_HANA_NAMESPACE_BEGIN namespace convert_detail { struct no_conversion { }; - template <typename ...> - struct is_valid { static constexpr bool value = true; }; - } + template <typename To, typename From, typename = void> + struct maybe_static_cast : no_conversion { + template <typename X> + static constexpr auto apply(X const&) { + static_assert(detail::wrong<to_impl<To, From>, X>{}, + "no conversion is available between the provided types"); + } + }; - template <typename To, typename From, bool condition> - struct to_impl<To, From, when<condition>> : convert_detail::no_conversion { - template <typename X> - static constexpr auto apply(X const&) { - static_assert(detail::wrong<to_impl<To, From>, X>{}, - "no conversion is available between the provided types"); - } - }; + template <typename To, typename From> + struct maybe_static_cast<To, From, decltype((void) + static_cast<To>(std::declval<From>()) + )> { + template <typename X> + static constexpr To apply(X&& x) + { return static_cast<To>(static_cast<X&&>(x)); } + }; + } // end namespace convert_detail - template <typename To, typename From> - struct to_impl<To, From, when<convert_detail::is_valid< - decltype(static_cast<To>(std::declval<From>())) - >::value>> { - template <typename X> - static constexpr To apply(X&& x) - { return static_cast<To>(static_cast<X&&>(x)); } - }; + template <typename To, typename From, bool condition> + struct to_impl<To, From, when<condition>> + : convert_detail::maybe_static_cast<To, From> + { }; template <typename To> struct to_impl<To, To> : embedding<> { |