在C ++ 17中,可以使用带有初始化程序的if语句来解压缩可选项吗?

时间:2016-09-20 16:22:26

标签: c++ c++17

我正在使用std :: optional's编写一些代码,我想知道C ++ 17的'if语句与初始化者'是否能够帮助解压缩值?

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

我正在编写Unpack函数:

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

但是,我的问题是。将C ++ 17'if语句与初始化程序'帮助吗?如果是这样,它将如何编码?

更新,这实际上是一个问题,当使用可选的极易滥用时,因为可选和*可选都返回bool并且当有人试图访问该值并忘记*时,您不会收到任何编译器警告。

3 个答案:

答案 0 :(得分:4)

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

但你当然可以这样做:

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

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

如果optional<T>建模了一个最多只有一个元素的容器,那么这是一个很好的地方,所以你可以这样做:

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

但我们没有那个界面。

答案 1 :(得分:2)

为了使其正常工作,如果没有解压缩值,则必须有一个值。

所以

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上下文中进行了回复,那么您应该只是:

if (auto i = get_optional())

然后在正文中使用*i

...

现在,如果optional声明operator*返回了一个引用,并且该返回值已定义为但未定义时尚未定义那么您可以编写Unpack方法或功能,不需要默认值。

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

答案 2 :(得分:-1)

也许这行得通:

auto optValue = getOptional();
if (auto value = *optValue; optValue) { ...use value here... }