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

标签 c++ c++17 iostream stdoptional

有没有一种相当惯用的方法*来使用流插入运算符 >>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/

相关文章:

c++ - 函数中的自动参数类型

c++ - 如何访问模板包参数的模板参数

ios - 无法快速提取模型类型

c++ - 为什么我的 istream_iterator 不起作用?

c++ - 如何检查容器是否稳定

c++ - 初始化无法从const char [3]转换为std::string *

c++ - 使用 union 会有好处吗?

c++ - 什么是 IO 流缓冲?

c++ - 从文件中获取数据并将元素输出到表中

c++ - 从托管在 QWebKit 上的 Flash Player 打开外部链接