如何直接将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
相关产品推荐
相关产品推荐

