Как применить концепты для передачи аргумента в метод класса?
У меня есть класс 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;
}