You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接将std::istream中的值读取到std::atomic对象中?

如何直接从std::istream读取值到std::atomic?

从std::istream读取普通类型的值十分简单,示例如下:

double d;
std::cin >> d;

但直接将值提取到std::atomic<double>中会编译失败,以下代码无法通过编译:

#include <iostream>
#include <atomic>

int main(){
  std::atomic<double> d;
  std::cin >> d;  // 编译失败

  return 0;
}

目前可以通过临时变量实现需求,但有没有无需借助临时变量的直接赋值方法?当前实现代码如下:

#include <iostream>
#include <atomic>

int main(){
  double tmp;
  std::cin >> tmp;

  std::atomic<double> d = tmp;

  return 0;
}

解决方案:自定义operator>>重载

标准库并未为std::atomic<T>提供默认的输入流提取运算符重载,我们可以自行实现一个通用版本:

#include <iostream>
#include <atomic>

template<typename T>
std::istream& operator>>(std::istream& is, std::atomic<T>& atomic_val) {
    T tmp;
    is >> tmp;
    // 仅当读取成功时更新原子变量
    if (is) {
        atomic_val.store(tmp);
    }
    return is;
}

int main(){
  std::atomic<double> d;
  std::cin >> d; // 现在可正常编译运行

  return 0;
}

说明

  • 该模板重载适用于所有支持std::istream提取操作的T类型(如int、float、double等)。
  • 内部虽然仍会使用临时变量,但业务代码中无需显式声明,对外呈现的是直接读取到原子变量的简洁接口。
  • 增加了读取状态判断,避免在输入失败时给原子变量赋予无效值。

内容的提问来源于stack exchange,提问作者John Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:09:23