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

У меня есть класс 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 ответ

Это довольно тривиально сinvokable. И вам не нужно требовать, чтобы он сталstd::function:

      auto and_then(std::invocable<T> auto func) ->
  monadic_optional<std::invoke_result_t<decltype(func), T>>
{
  if(this->has_value())
    return std::invoke(func, *this);
  return std::nullopt;
}
Другие вопросы по тегам