summaryrefslogtreecommitdiff
path: root/boost/hana/core/to.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/core/to.hpp')
-rw-r--r--boost/hana/core/to.hpp40
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<> {