Is there a way, idiomatically, to provide a constructor/conversion which takes a std::optional<T> and returns a std::optional<U>? For instance, ideally I would love some kind of syntax like
#include <optional>
struct MyInt {
explicit MyInt(int i_) : i{i_} {}
// magic here?...
int i;
};
int main()
{
MyInt i1 = MyInt(1);
std::optional<int> opt_i{};
std::optional<MyInt> i2 = MyInt(opt_i); // empty
opt_i = 3;
std::optional<MyInt> i3 = MyInt(opt_i); // contains MyInt(3)
}
I believe this is not currently possible. What are my best options?
std::optional::transform?auto i1 = std::optional<int>(); auto i2 = i1.transform([](auto&& i){return MyInt(std::forward<decltype(i)>(i));});std::optionalconstructor?std::optional<MyInt> i2{opt_i};just works.