diff --git a/include/continuable/continuable-base.hpp b/include/continuable/continuable-base.hpp index 384d94f..c09028e 100644 --- a/include/continuable/continuable-base.hpp +++ b/include/continuable/continuable-base.hpp @@ -115,8 +115,7 @@ using detail::base::is_continuable; /// /// \since 1.0.0 template -class continuable_base - : detail::composition::materializer> { +class continuable_base { /// \cond false template @@ -626,6 +625,11 @@ private: ownership_.release(); } + auto materialize() && { + return detail::composition::materializer::apply( + std::move(*this)); + } + Data&& consume_data() && { assert_acquired(); release(); diff --git a/include/continuable/detail/composition.hpp b/include/continuable/detail/composition.hpp index b2e8b26..1c25f7b 100644 --- a/include/continuable/detail/composition.hpp +++ b/include/continuable/detail/composition.hpp @@ -163,9 +163,8 @@ auto finalize_composition(continuable_base&& continuation) { /// provide a materializer method which will finalize an oustanding strategy. template struct materializer { -protected: - constexpr auto&& materialize() && { - return std::move(*static_cast(this)); + static constexpr auto&& apply(Continuable&& continuable) { + return std::move(continuable); } }; template @@ -173,10 +172,8 @@ struct materializer< continuable_base, std::enable_if_t::value>> { -protected: - constexpr auto materialize() && { - return finalize_composition( - std::move(*static_cast*>(this))); + static constexpr auto apply(continuable_base&& continuable) { + return finalize_composition(std::move(continuable)); } };