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 都返回布尔值,并且当有人试图访问该值并忘记 *.
没有,也不可能有这样的
但你当然可以:
1 2 3 | if (std::optional<int> o = GetOptionalInt(); o) { // use *o here } |
虽然额外的
如果
1 2 3 | for (int value : GetOptionalInt()) { // possibly not entered } |
但我们没有那个界面。
为了使其工作,如果未打包的值不存在,则必须有一个值。
所以
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 } ) } |
会做你想做的。
但是作为一个
1 | if (auto i = get_optional()) |
然后在正文中使用
...
现在,如果
据我所知,这不是真的。由于它并没有真正添加任何东西,我不明白为什么它应该是真的。
也许这会起作用:
1 2 | auto optValue = getOptional(); if (auto value = *optValue; optValue) { ...use value here... } |