std::basic_ios<CharT,Traits>::copyfmt
来自 cppreference.cn
basic_ios& copyfmt( const basic_ios& other ); |
||
如果 other 指的是与 *this 相同的对象,则不产生任何效果。否则,将流 other 的状态复制到 *this。按以下顺序完成:
2) 从 other 复制所有成员对象到 *this,除了 rdstate()、异常掩码和 rdbuf()。具体来说,复制区域设置、格式标志、数组 std::ios_base::iword 和 std::ios_base::pword 的内容(但不包括
iword
和 pword
指针本身)、回调和绑定的流。4) 从 other 复制异常掩码到 *this,如同通过调用 exceptions(other.exceptions())。
目录 |
[编辑] 参数
其他 | - | 要用作源的另一个流 |
[编辑] 返回值
*this
[编辑] 注意
第二次遍历回调可用于深度复制 std::ios_base::pword 中指针指向的用户定义对象。
copyfmt()
可用于保存和恢复流的状态。Boost 为此目的提供了一个更细粒度的 I/O 状态保存器 库。
[编辑] 示例
使 std::ofstream 对象 "out" 的行为与 std::cout 完全相同,包括格式化,tie()
到 std::cin 等。
运行此代码
#include <bitset> #include <climits> #include <fstream> #include <iostream> int main() { std::ofstream out; out.copyfmt(std::cout); // copy everything except rdstate and rdbuf out.clear(std::cout.rdstate()); // copy rdstate out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // share the buffer out << "Hello, world\n"; auto bin = [](std::ios_base::fmtflags f) { return std::bitset<sizeof(std::ios_base::fmtflags) * CHAR_BIT> { static_cast<unsigned long long>(f) }; }; std::ofstream out2; std::cout << "1) out2.flags(): " << bin(out2.flags()) << '\n'; std::cout << "2) cout.flags(): " << bin(std::cout.flags()) << '\n'; std::cout.setf(std::ios::hex | std::ios::fixed | std::ios::boolalpha); std::cout << "3) cout.flags(): " << bin(std::cout.flags()) << '\n'; out2.copyfmt(std::cout); // copy everything except rdstate and rdbuf std::cout << "4) out2.flags(): " << bin(out2.flags()) << '\n'; }
可能的输出
Hello, world 1) out2.flags(): 00000000000000000001000000000010 2) cout.flags(): 00000000000000000001000000000010 3) cout.flags(): 00000000000000000001000000001111 4) out2.flags(): 00000000000000000001000000001111
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 256 | C++98 | 步骤 3 使用了事件类型 copy_event 调用已注册的回调,但该类型未定义。event type copy_event , which is not defined |
更正为 copyfmt_event |
LWG 292 | C++98 | 如果 other 指的是与 *this 相同的对象,则仍会复制成员对象并调用已注册的回调。 were still copied and the registered callbacks were still called |
do nothing 在这种情况下 |