关于 c :在 C 17 中,是否可以使用带有初始化程序的 if 语句来解压缩可选项? | 珊瑚贝

In C++17 can an if statement with an initializer be used to unpack an optional?


我正在使用 std::optional 编写一些代码,我想知道 C 17 的”带有初始化程序的 if 语句”是否能够帮助解压缩值?

1
std::optional<int> optionalInt = GetOptionalInt();

我在这里编写函数 Unpack:

1
2
3
4
if( auto [value, has_value] = optionalInt.Unpack(); has_value )
{
    // Use value here.
}

但是,我的问题是。 C 17 ‘if statement with initializer’ 在这里有帮助吗?如果是这样,它将如何编码?

更新,这实际上主要是使用 optional 时的一个问题,这非常容易被误用,因为 optional 和 *optional 都返回布尔值,并且当有人试图访问该值并忘记 *.

  • “if” 是一个语句,而不是一个表达式。


没有,也不可能有这样的 Unpack() 函数。

但你当然可以:

1
2
3
if (std::optional<int> o = GetOptionalInt(); o) {
    // use *o here
}

虽然额外的 o 检查有点多余。

如果 optional<T> 模拟一个最多包含一个元素的容器,这是其中之一,你可以这样做:

1
2
3
for (int value : GetOptionalInt()) {
    // possibly not entered
}

但我们没有那个界面。

  • 不可能有一个解包,我猜是因为它必须复制构造你真正想要引用它的值,并且当没有值时,类型必须有一个默认构造函数?
  • 我想这已经可以了: if (std::optional<int> o = GetOptionalInt()) { // 在这里使用 *o }
  • @ScottLangham 两个帐户都正确。
  • @ScottLangham:是的,因为 optional 可以根据上下文转换为 bool。对于那些情况,现有控制结构的条件部分已经足够了,因为它是对某些东西的声明。初始化器对所有其他情况都很有用,例如if (auto it = m.find(key); it != m.end())。在这种情况下,只有 if (auto it = m.find()) 不起作用,因为单独的迭代器不会形成谓词。
  • @KerrekSB。是的。在使用 std::optional<bool> 的情况下,这一切都变得非常容易出错。很容易忘记 if 正文中的 *。因此,某种解包值并同时测试它是否有效的方法可能有助于避免该错误。我猜 Barry 的 for(int value : GetOptionalInt()) 可能是一个解决方案,一些适配器可以使它工作:for(int value: OptionalToZeroOrOneElementContainer(GetOptionalInt())。可能需要一个更简洁的名称!
  • @ScottLangham:对于可选的布尔值,您可以处理所有情况:if (optional<bool> ob = f(); !o) { … } else if (!*o) { … } else { … }。


为了使其工作,如果未打包的值不存在,则必须有一个值。

所以

1
2
3
4
template<class T, class U>
std::pair< T, bool > unpack_value( std::optional< T > const& o, U&& u ) {
  return { o.value_or(std::forward<U>(u)), (bool)o } )
}

会做你想做的。

但是作为一个 optional 如果它在一个 bool 上下文中已经返回,你真的应该只是:

1
if (auto i = get_optional())

然后在正文中使用 *i。

现在,如果 optional 声明 operator* 返回了一个引用,并且该返回值已定义,但在未使用时未定义访问它,那么您可以编写一个 Unpack 方法或函数需要一个默认值。

据我所知,这不是真的。由于它并没有真正添加任何东西,我不明白为什么它应该是真的。


也许这会起作用:

1
2
auto optValue = getOptional();
if (auto value = *optValue; optValue) {use value here… }



来源:https://www.codenong.com/39599242/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9544.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?