@@ -39,27 +39,29 @@ BOOST_HANA_NAMESPACE_BEGIN
39
39
namespace convert_detail {
40
40
struct no_conversion { };
41
41
42
- template <typename ...>
43
- struct is_valid { static constexpr bool value = true ; };
44
- }
42
+ template <typename To, typename From, typename = void >
43
+ struct maybe_static_cast : no_conversion {
44
+ template <typename X>
45
+ static constexpr auto apply (X const &) {
46
+ static_assert (detail::wrong<to_impl<To, From>, X>{},
47
+ " no conversion is available between the provided types" );
48
+ }
49
+ };
45
50
46
- template <typename To, typename From, bool condition>
47
- struct to_impl <To, From, when<condition>> : convert_detail::no_conversion {
48
- template <typename X>
49
- static constexpr auto apply (X const &) {
50
- static_assert (detail::wrong<to_impl<To, From>, X>{},
51
- " no conversion is available between the provided types" );
52
- }
53
- };
51
+ template <typename To, typename From>
52
+ struct maybe_static_cast <To, From, decltype((void )
53
+ static_cast <To>(std::declval<From>())
54
+ )> {
55
+ template <typename X>
56
+ static constexpr To apply (X&& x)
57
+ { return static_cast <To>(static_cast <X&&>(x)); }
58
+ };
59
+ } // end namespace convert_detail
54
60
55
- template <typename To, typename From>
56
- struct to_impl <To, From, when<convert_detail::is_valid<
57
- decltype (static_cast <To>(std::declval<From>()))
58
- >::value>> {
59
- template <typename X>
60
- static constexpr To apply (X&& x)
61
- { return static_cast <To>(static_cast <X&&>(x)); }
62
- };
61
+ template <typename To, typename From, bool condition>
62
+ struct to_impl <To, From, when<condition>>
63
+ : convert_detail::maybe_static_cast<To, From>
64
+ { };
63
65
64
66
template <typename To>
65
67
struct to_impl <To, To> : embedding<> {
0 commit comments