【发布时间】:2018-07-18 12:09:11
【问题描述】:
C++ 蒸汽对象有状态。如果有人写一段代码,比如
using namespace std;
cout << hex << setw(8) << setfill('0') << x << endl;
忘记设置流状态。这会导致其他一些不相关的代码出现问题。进行“set”和“set back”配对匹配很乏味。除此之外,在我看来这也违反了 RAII 背后的约定。
我的问题是:是否有可能只用一层薄薄的包装,使这些状态操作类似于 RAII。也就是说,在分号表达式结束后,流状态会自动设置回默认值。
更新:按照@0x499602D2 提供的链接,一种解决方法可能类似于
#include <boost/io/ios_state.hpp>
#include <ios>
#include <iostream>
#include <ostream>
#define AUTO_COUT(x) {\
boost::io::ios_all_saver ias( cout );\
x;\
}while(0)
然后就可以像这样使用宏了
AUTO_COUT(cout << hex << setw(8) << setfill('0') << x << endl);
顺便说一句,在 boost::io::ios_state 的保护类中添加一个锁定字段可能是个好主意,以防多线程程序中发生有趣的事情。还是他们已经这样做了?
【问题讨论】:
-
Boost 有这个boost.org/doc/libs/1_66_0/libs/io/doc/ios_state.html的实用程序
-
@0x499602D2 boost::io::ios_state 是否保护流状态免受状态的多线程操作?
-
不,它没有。
-
为了使您的
AUTO_COUT()线程安全,也可以添加std::lockguard<std::mutex>。有趣,够了。我回答中的代码曾经受到这些监护人的启发。 :-) (我是在 gtkmm 中第一次看到的。)