Как применить концепты для передачи аргумента в метод класса?

У меня есть класс optional_monadic, который я наследую от класса std::optional

    template <class T>
    class monadic_optional : public std::optional<T>
    {
    public:
     using std::optional<T>::optional;
     monadic_optional(T value) : std::optional<T>(value) {}
    }

В этом классе я описываю метод

    template <class Return>
    nonstd::monadic_optional<Return> and_then(std::function<nonstd::monadic_optional<Return>(T)> func)
    {
        if (this->has_value())
            return func(this->value());
        else
            return std::nullopt;
    }

Я хочу использовать концепты, для того, чтобы передавать в метод шаблон, который бы проверялся на то, является ли он функцией. Как мне реализовать это, используя концепты?

    template <class T>
    concept convertible_to_func = std::convertible_to <T, std::function<nonstd::monadic_optional<Return>(T)>>
    requires
    {
    };
    nonstd::monadic_optional<T>   
    and_then(T func)
    {
        if (this->has_value())
            return func(this->value());
        else
            return std::nullopt;
    }

По идее выглядеть должно как-то так, но это не компилится.


Ответы (1 шт):

Автор решения: HolyBlackCat

Код не запускал, но вообще это делается так:

template <std::invocable<value_type &> F> // Где `value_type &` - нужный параметр функции.
auto and_then(F &&func) -> nonstd::monadic_optional<decltype(std::forward<F>(func)(this->value()))>
{
    if (this->has_value())
        return std::forward<F>(func)(this->value());
    else
        return std::nullopt;
}
→ Ссылка