std::可选的流插入运算符>>

问题描述 投票:0回答:1
是否有一种相当惯用的方法*来使用流插入运算符

>>

std::optional
?标准类不提供 
std::istream& operator>>(std::istream& is, std::optional<T>& obj)
 的重载,我相信使用

std::optional<int> i{}; stream >> *i;
如果 
i

还没有值,

调用未定义的行为。

*是的,我知道流没有什么是惯用的或自然的......

c++ c++17 iostream
1个回答
1
投票
你是对的。

*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);
    
© www.soinside.com 2019 - 2024. All rights reserved.