diff --git a/include/continuable/continuable-result.hpp b/include/continuable/continuable-result.hpp index 7daff9c..67550d6 100644 --- a/include/continuable/continuable-result.hpp +++ b/include/continuable/continuable-result.hpp @@ -130,23 +130,18 @@ class result { using trait_t = detail::result_trait; using surrogate_t = typename trait_t::surrogate_t; - struct init_arg_t {}; - - template ()...))>* = nullptr> - explicit result(init_arg_t, Args&&... values) + template + explicit result(detail::init_arg_t, Args&&... values) : variant_(trait_t::wrap(std::forward(values)...)) { } - explicit result(init_arg_t, exception_t exception) + explicit result(detail::init_arg_t, exception_t exception) : variant_(std::move(exception)) { } public: using value_t = typename trait_t::value_t; - template (), std::declval()...))>* = nullptr> + template explicit result(FirstArg&& first, Args&&... values) : variant_(trait_t::wrap(std::forward(first), std::forward(values)...)) { @@ -250,11 +245,11 @@ public: /// Creates a present result from the given values static result from(T... values) { - return result{init_arg_t{}, std::move(values)...}; + return result{detail::init_arg_t{}, std::move(values)...}; } /// Creates a present result from the given exception static result from(exception_t exception) { - return result{init_arg_t{}, std::move(exception)}; + return result{detail::init_arg_t{}, std::move(exception)}; } /// Creates an empty result diff --git a/include/continuable/detail/operations/loop.hpp b/include/continuable/detail/operations/loop.hpp index 8e991e6..ba4ed72 100644 --- a/include/continuable/detail/operations/loop.hpp +++ b/include/continuable/detail/operations/loop.hpp @@ -54,16 +54,15 @@ struct loop_trait { "cti::continuable_base which resolves to a cti::result."); }; -template -struct loop_trait>>> { +template +struct loop_trait>> { template static auto make(Callable&& callable) { return make_continuable(std::forward(callable)); } }; -template -struct loop_trait>>> { +template <> +struct loop_trait>> { template static auto make(Callable&& callable) { return make_continuable(std::forward(callable)); @@ -143,7 +142,11 @@ template auto loop(Callable&& callable, Args&&... args) { using invocation_result_t = decltype(util::invoke(callable, args...).finish()); - using trait_t = loop_trait; + + auto constexpr hint = base::annotation_of(identify{}); + + using trait_t = loop_trait>; + return trait_t::make([callable = std::forward(callable), args = std::make_tuple(std::forward( args)...)](auto&& promise) mutable { diff --git a/include/continuable/detail/utility/result-trait.hpp b/include/continuable/detail/utility/result-trait.hpp index b3fa9bb..4092d33 100644 --- a/include/continuable/detail/utility/result-trait.hpp +++ b/include/continuable/detail/utility/result-trait.hpp @@ -93,6 +93,8 @@ struct result_trait { return std::get(std::forward(result).get_value()); } }; + +struct init_arg_t {}; } // namespace detail } // namespace cti