有没有一种方法可以惯用地提供一个构造函数/转换,它接受
std::optional<T>
并返回 std::optional<U>
?例如,理想情况下我会喜欢某种语法,例如
#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)
}
我认为目前这是不可能的。我最好的选择是什么?
您可以创建一个函数来为您执行转换:
#include <optional>
struct MyInt {
explicit MyInt(int i_) : i{i_} {}
int i;
};
template <typename T, typename U>
std::optional<T> optional_cast(const std::optional<U>& opt)
{
if (opt)
{
return std::make_optional<T>(*opt);
}
return std::nullopt;
}
int main()
{
MyInt i1 = MyInt(1);
std::optional<int> opt_i{};
std::optional<MyInt> i2 = optional_cast<MyInt>(opt_i); // empty
opt_i = 3;
std::optional<MyInt> i3 = optional_cast<MyInt>(opt_i); // contains MyInt(3)
}
std::optional::transform
来实现它
template <typename T, typename U>
std::optional<T> optional_cast(const std::optional<U>& opt)
{
return opt.transform([](const U& u) { return T(u); });
}