66#include < array>
77#include < optional>
88#include < tuple>
9+ #include < variant>
910
1011namespace cr {
1112
@@ -33,26 +34,17 @@ auto CreateArray(std::index_sequence<Is...>, T && tuple, F && transform)
3334}
3435
3536template <typename T>
36- struct TypeConverter
37+ struct NonVoid
3738{
3839 using Type = T;
3940};
4041
4142template <>
42- struct TypeConverter <void >
43+ struct NonVoid <void >
4344{
4445 using Type = std::monostate;
4546};
4647
47- template <typename T>
48- struct NonVoid ;
49-
50- template <template <typename ...> typename C, typename ... Ts>
51- struct NonVoid <C<Ts...>>
52- {
53- using Type = C<typename TypeConverter<Ts>::Type...>;
54- };
55-
5648} // namespace internal
5749
5850template <typename T>
@@ -61,12 +53,12 @@ using NonVoid = typename internal::NonVoid<T>::Type;
6153struct AnyOfFn
6254{
6355 template <Executor E, TaskResult... Rs>
64- using HandleType = TaskHandle<NonVoid< std::variant<Rs ...> >, E>;
56+ using HandleType = TaskHandle<std::variant<NonVoid<Rs> ...>, E>;
6557
6658 template <Executor E, TaskResult... Rs>
6759 HandleType<E, Rs...> operator ()(TaskHandle<Rs, E>... ts) const
6860 {
69- std::optional<NonVoid< std::variant<Rs ...> >> ret;
61+ std::optional<std::variant<NonVoid<Rs> ...>> ret;
7062 stdcr::coroutine_handle<> continuation = nullptr ;
7163
7264 auto TaskWrapper = [&]<size_t I, typename R>(std::in_place_index_t <I> i,
@@ -76,7 +68,7 @@ struct AnyOfFn
7668
7769 if constexpr (std::is_same_v<R, void >) {
7870 co_await std::move (task);
79- ret.emplace (i, internal::TypeConverter <void >::Type {});
71+ ret.emplace (i, NonVoid <void >{});
8072 } else {
8173 R tmp = co_await std::move (task);
8274 ret.emplace (i, std::move (tmp));
0 commit comments