summaryrefslogtreecommitdiff
path: root/boost/hana/core/to.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
commitb8cf34c691623e4ec329053cbbf68522a855882d (patch)
tree34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/hana/core/to.hpp
parent3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff)
downloadboost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.gz
boost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.bz2
boost-b8cf34c691623e4ec329053cbbf68522a855882d.zip
Imported Upstream version 1.67.0upstream/1.67.0
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<> {