有没有办法将typecast可选的无符号
std::optional<unsigned>
变量转换为无符号
#include <optional>
#include <iostream>
int main()
{
std::optional<unsigned> check = 200;
std::cout << check << std::endl;
std::cout << check.emplace() << std::endl;
return 0;
}
在上面的函数中,当我尝试打印
check
(可选变量)时,出现以下错误:
main.cpp: In function ‘int main()’:
main.cpp:15:15: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream’} and ‘std::optional’)
15 | std::cout << check << std::endl;
| ~~~~~~~~~ ^~ ~~~~~
| | |
| | std::optional<unsigned int>
| std::ostream {aka std::basic_ostream<char>}
下面是我尝试使用 emplace 打印时的结果,因为
check.emplace()
是:
#include <optional>
#include <iostream>
int main()
{
std::optional<unsigned> check = 200;
// std::cout << check << std::endl;
std::cout << check.emplace() << std::endl;
return 0;
}
结果:
0
...Program finished with exit code 0
Press ENTER to exit console.
上面的例子只是为了演示我的问题。实际程序有
std::optional<unsigned> check
是因为它带有默认参数是可选的。当用户传递不同的参数时,我想将 arg
传递给以 unsigned
作为参数的函数。
这些帖子: 移动可选变量的值,使用流和模板取出值,使用可选讨论上述主题。他们都没有简单地解释如何打印或获取
optional variable
的值。
有人可以解释为什么会出现上述问题以及我能做些什么来解决它吗?
std::optional
有多种方法来访问它所保存的值:
operator*
std::cout << *check << std::endl;
value()
std::cout << check.value() << std::endl;
value_or()
std::cout << check.value_or(0) << std::endl;
只需确保在调用 operator bool
或
has_value()
之前使用 optional
或 operator*
方法来验证 value()
是否持有值。
关于第一行:
std::cout << check << std::endl;
将
std::optional
转换为其包含的值时,需要处理它为空的情况。std::optional::value_or
来实现这一点。std::optional::value_or
返回 std::optional
中的值(如果有),或者如果 std::optional
为空,则将该值作为参数传递给 value_or
:
std::cout << check.value_or(999) << std::endl;
这将输出:
200
(如果
999
为空,则输出将为 std::optional
)
如果您确定
optional
不为空(您可以使用 operator bool
或 has_value
方法来检查这一点),您还可以使用 operator*
或使用 来获取其中包含的值value
方法:
if (check) // or `if (check.has_value())`
{
std::cout << *check << std::endl;
std::cout << check.value() << std::endl;
}
关于第二行:
std::cout << check.emplace() << std::endl;
std::optional::emplace
在 std::optional
中存储一个值,并返回对此值的引用。由于您没有提供任何具体值,因此将使用默认值 0
,这就是您看到的打印内容。