Что делает концепция __completion_signature в stdexec (отправители/получатели)?
Я рассматриваю эталонную реализацию P2300 ( предложение отправителей и получателей).
У меня возникли проблемы с пониманием части кода :
namespace __compl_sigs {
template <same_as<set_value_t> _Tag, class _Ty = __q<__types>, class... _Args>
__types<__minvoke<_Ty, _Args...>> __test(_Tag (*)(_Args...));
template <same_as<set_error_t> _Tag, class _Ty = __q<__types>, class _Error>
__types<__minvoke<_Ty, _Error>> __test(_Tag (*)(_Error));
template <same_as<set_stopped_t> _Tag, class _Ty = __q<__types>>
__types<__minvoke<_Ty>> __test(_Tag (*)());
template <class, class = void>
__types<> __test(...);
template <class _Tag, class _Ty = void, class... _Args>
void __test(_Tag (*)(_Args...) noexcept) = delete;
template <class _Sig>
concept __completion_signature = __typename<decltype(__compl_sigs::__test((_Sig*) nullptr))>;
} // namespace __compl_sigs
using __compl_sigs::__completion_signature;
// [...]
template <__compl_sigs::__completion_signature... _Sigs>
struct completion_signatures {
// Uncomment this to see where completion_signatures is
// erroneously getting instantiated:
//static_assert(sizeof...(_Sigs) == -1u);
};
По сути, может ли кто-нибудь дать мне пример отправителя и что__types<__minvoke<_Ty, _Args...>>
,__types<__minvoke<_Ty, _Error>>
и__types<__minvoke<_Ty>>
на самом деле имеется в виду? Я понимаю, что они касаютсяset_value
,set_error
иset_stopped
.
Наконец, какая польза отcompletion_signatures
?