Насколько я знаю, стандартная библиотека не предоставляет такой функциональности из коробки. Это довольно легко реализовать, хотя.
#include <optional>
#include <iostream>
#include <functional>
std::optional<int> create_an_int()
{
return 1;
}
std::optional<int> dont_create_an_int()
{
return {};
}
template<typename T, typename F>
auto handler_wrapper(const std::optional<T>& in, F h)
{
return in.has_value() ? std::optional{h(*in)} : std::nullopt;
}
int main()
{
auto handler = [](const int& in){ return 3*in; };
auto test = create_an_int();
auto multiplied = handler_wrapper(test, handler);
std::cout << *multiplied << std::endl;
test = dont_create_an_int();
auto nulled = handler_wrapper(test, handler);
if (!nulled.has_value())
std::cout << "null optional" << std::endl;
}
По сути, все, что вам нужно сделать, - это создать шаблонную оболочку, принимающую любые вызываемые и необязательные, и все готово (примечание: приведенный выше фрагмент не самая красивая / лучшая реализация, но, я думаю, должна дать вам хорошую отправную точку) ,
Код выше, очевидно, выдаст «3» и «необязательный ноль» в качестве вывода.