refactor: small downcasting refactoring

This commit is contained in:
Mateusz Pusz
2020-09-12 21:20:17 +02:00
parent be46ac77d6
commit a19c97fe85
2 changed files with 6 additions and 14 deletions

View File

@ -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();

View File

@ -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>());