forked from mpusz/mp-units
refactor: small downcasting refactoring
This commit is contained in:
@ -111,7 +111,7 @@ In the above example:
|
|||||||
|
|
||||||
template<typename Target, Downcastable T>
|
template<typename Target, Downcastable T>
|
||||||
struct downcast_child : T {
|
struct downcast_child : T {
|
||||||
friend auto downcast_guide(typename downcast_child::downcast_base) { return Target(); }
|
friend auto downcast_guide(typename T::downcast_base) { return Target(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
This is the place where the actual return type of the ``downcast_guide`` function is provided
|
This is the place where the actual return type of the ``downcast_guide`` function is provided
|
||||||
@ -147,14 +147,12 @@ otherwise it works like a regular identity type trait returning a provided base
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept has_downcast = requires {
|
concept has_downcast_guide = requires(T t) { downcast_guide(t); };
|
||||||
downcast_guide(std::declval<downcast_base<T>>());
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr auto downcast_target_impl()
|
constexpr auto downcast_target_impl()
|
||||||
{
|
{
|
||||||
if constexpr(has_downcast<T>)
|
if constexpr(has_downcast_guide<T>)
|
||||||
return decltype(downcast_guide(std::declval<downcast_base<T>>()))();
|
return decltype(downcast_guide(std::declval<downcast_base<T>>()))();
|
||||||
else
|
else
|
||||||
return T();
|
return T();
|
||||||
|
12
src/include/units/bits/external/downcasting.h
vendored
12
src/include/units/bits/external/downcasting.h
vendored
@ -48,16 +48,10 @@ concept Downcastable =
|
|||||||
std::derived_from<T, downcast_base<typename T::downcast_base_type>>;
|
std::derived_from<T, downcast_base<typename T::downcast_base_type>>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept has_downcast_guide =
|
concept has_downcast_guide = requires(T t) { downcast_guide(t); };
|
||||||
requires {
|
|
||||||
downcast_guide(std::declval<downcast_base<T>>());
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept has_downcast_poison_pill =
|
concept has_downcast_poison_pill = requires(T t) { downcast_poison_pill(t); };
|
||||||
requires {
|
|
||||||
downcast_poison_pill(std::declval<downcast_base<T>>());
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Target, Downcastable T>
|
template<typename Target, Downcastable T>
|
||||||
struct downcast_child : T {
|
struct downcast_child : T {
|
||||||
@ -98,7 +92,7 @@ constexpr auto downcast_impl()
|
|||||||
return T();
|
return T();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace detail
|
||||||
|
|
||||||
template<Downcastable T>
|
template<Downcastable T>
|
||||||
using downcast = decltype(detail::downcast_impl<T>());
|
using downcast = decltype(detail::downcast_impl<T>());
|
||||||
|
Reference in New Issue
Block a user