有没有一种相当惯用的方法*来使用流插入运算符 >>
与 std::optional
?标准类不提供 std::istream& operator>>(std::istream& is, std::optional<T>& obj)
的重载,我相信使用
std::optional<int> i{};
stream >> *i;
如果 i
则调用未定义的行为还没有值。
*是的,我知道关于流的任何内容都不是惯用的或自然的......
最佳答案
你是对的。 *i
是空 std::Optional
的未定义行为。
你应该做的是:
auto i = [&stream] -> std::optional<int> {
int result;
if (stream >> result) return result;
else return {};
}();
除了立即调用的 lambda 表达式 (IILE),您还可以编写一个实用函数来为您执行此操作:
template <typename T>
std::optional<T> try_read(std::istream& stream) {
T result;
if (stream >> result) return result;
else return {};
}
// ...
std::optional<int> i = try_read<int>(stream);
关于c++ - std::可选的流插入运算符 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77822697/