微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用三元运算符初始化 boost::optional

如何解决用三元运算符初始化 boost::optional

是一种初始化可选的方法,例如:

bool conditional = true;
boost::optional<int> opt = conditional ? 5 : boost::none;

为什么会出现错误?:

main.cpp:31:31: error: operands to ?: have different types ‘int’ and ‘const boost::none_t’
boost::make_optional(cond ? 5 : boost::none);
      |                          ~~~~~^~~~~~~~~~~~~~~~~

通过简单的 if else 我可以做到:

boost::optional<int> opt;
if (cond)
    opt = 5;
else
    opt = boost::none;

解决方法

三元运算符要求左右为相同(或可转换)类型。 none_tint 不是同一类型。你可能会做cond ? boost::optional<int>(5) : boost:none

我不使用 boost,所以只是根据 std::optional 猜测语法,但以下确实有效:

std::optional<int> opt = cond ? std::optional<int>(5) : std::nullopt;
,

?a:b 要求 ab 有一个公共类型来转换为 C++ 可以推断的类型。

boost::none5 没有这个。

auto opt = conditional ? boost::optional<int>(5) : boost::none;

有效

auto opt = conditional ? 5 : boost::optional<int>();

也有效。

你也可以写一个助手

auto opt = maybe_optional( conditional,5 );

哪里

template<class T>
boost::optional<T> maybe_optional( bool b,T t ) {
  if (b) return std::forward<T>(t);
  return boost::none;
}
,

三元运算符的结果必须是单一类型。 : 的左右参数因此需要为相同类型,或可转换为相同类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。