如何在 C++ 中将 std::Optional<unsigned> 转换为无符号? [重复]

问题描述 投票:0回答:2

有没有办法将可选的无符号变量类型转换为无符号

#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
 作为参数的函数。

有人可以解释为什么会出现上述问题以及我能做些什么来解决它吗?

c++ casting option-type stdoptional
2个回答
2
投票

关于第一行:

std::cout << check << std::endl;

std::optional

 转换为其包含的值时,需要处理它为空的情况。
您可以使用
std::optional::value_or
 来实现:

std::cout << check.value_or(999) << std::endl;
这将输出:

200

(如果 999

 为空,则输出将为 
std::optional

关于第二行:

std::cout << check.emplace() << std::endl;

std::optional::emplace

std::optional
 中存储一个值,并返回对此值的引用。由于您没有提供任何具体值,因此将使用默认值 
0
,这就是您看到的打印内容。

现场演示(双线)

旁注: (1)
为什么不应该#include . (2)
“using namespace std;”有什么问题?.


1
投票

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()
 是否持有值。

© www.soinside.com 2019 - 2024. All rights reserved.