25 using type = std::reference_wrapper<T>;
30 template<
class return_t,
class... args_t>
33 using return_type =
typename details::select_reference<return_t>::type;
36 std::optional<return_type> optResult;
39 [&nArg, &optResult]<
class T>(T&& arg)
41 if (nArg++ ==
sizeof...(args_t) || predicates::is_valid(arg))
43 optResult =
static_cast<return_type
>(std::forward<T>(arg));
50 }(std::forward<args_t>(args))
53 return std::move(*optResult);
56 template<
class... args_t>
58 constexpr
auto coalesce(args_t&&... args)
63 std::optional<return_type> optResult;
66 [&nArg, &optResult]<
class T>(T&& arg)
68 if (nArg++ ==
sizeof...(args_t) || predicates::is_valid(arg))
70 optResult = std::forward<T>(arg);
77 }(std::forward<args_t>(args))
80 return std::move(*optResult);
constexpr return_t coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.