Что делает концепция __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?

0 ответов

Другие вопросы по тегам