在C++17中,可以使用带有初始值设定项的if语句来解压缩可选项
In C++17 can an if statement with an initializer be used to unpack an optional?
我正在使用std::optional编写一些代码,我想知道C++17的"if语句和初始化程序"是否能够帮助解包值?
std::optional<int> optionalInt = GetOptionalInt();
我正在制作函数Unpack here:
if( auto [value, has_value] = optionalInt.Unpack(); has_value )
{
// Use value here.
}
但是,我的问题是。C++17的if语句和初始值设定项在这里有帮助吗?如果是,它将如何编码?
更新,这实际上主要是使用optional时的一个问题,它非常容易被滥用,因为optional和*optional都返回bools,当有人试图访问该值并忘记*时,你不会得到任何编译器警告。
没有也不可能有这样的Unpack()
函数。
但你当然可以:
if (std::optional<int> o = GetOptionalInt(); o) {
// use *o here
}
尽管额外的CCD_ 2检查有点多余。
如果optional<T>
对一个最多包含一个元素的容器进行建模,这将是一个很好的地方,这样你就可以做到:
for (int value : GetOptionalInt()) {
// possibly not entered
}
但我们没有那个接口。
为了使其工作,如果未封装的值不存在,则必须有一个值。
所以
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())
然后在体内使用CCD_ 6。
现在,如果optional
声明operator*
返回了一个引用,并且该返回值被定义为,但在未参与时访问它没有被定义,那么您可以编写一个不需要默认值的Unpack
方法或函数。
据我所知,这不是真的。由于它并没有真正增加任何内容,我不明白为什么它应该是真的。
也许这会奏效:
auto optValue = getOptional();
if (auto value = *optValue; optValue) { ...use value here... }
相关文章:
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 需要有关此 if 语句的帮助
- 转换器练习:跳过 if 语句和 if 语句
- 避免在 C++ 中的 if 语句中递增
- 如果仍然不满足要求,如何使 if 语句重复?
- do while 循环中的 if 语句以 yes 或 no 结尾
- 为什么在此C++代码中触发此 if 语句?
- 如何基于平台在制作文件中制作if语句?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++ If 语句,从其他语句重复