std::可选参数的传递构造函数

问题描述 投票:0回答:1

有没有一种方法可以惯用地提供一个构造函数/转换,它接受

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)
}

我认为目前这是不可能的。我最好的选择是什么?

c++ c++17 stdoptional
1个回答
0
投票

您可以创建一个函数来为您执行转换:

#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)
}

你也可以使用c++23的

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); });
}
© www.soinside.com 2019 - 2024. All rights reserved.