std::basic_ios<CharT,Traits>::copyfmt
From cppreference.com
| 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` ポインタ自体は除く)のコピー、コールバック、および tied ストリームを作成します。
4) 例外マスクを other から *this に、exceptions(other.exceptions()) を呼び出すかのようにコピーします。
目次 |
[編集] パラメータ
| その他 | - | ソースとして使用する別のストリーム |
[編集] 戻り値
*this
[編集] 注意
コールバックの2回目の通過は、std::ios_base::pword のポインタに含まれるユーザー定義オブジェクトをディープコピーするために使用される場合があります。
copyfmt() は、ストリームの状態を保存および復元するために使用できます。Boost は、同じ目的のための、よりきめ細かな I/O 状態セーバーライブラリを提供しています。
[編集] 例
std::ofstream オブジェクト "out" を、フォーマット、tie() による std::cin へのバインドなど、すべてにおいて std::cout とまったく同じように動作させます。
このコードを実行
#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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 256 | C++98 | ステップ 3 は、登録されたコールバックを イベントタイプ copy_event で呼び出しましたが、これは定義されていません。 |
に修正されました copyfmt_event |
| LWG 292 | C++98 | もし other が *this と同じオブジェクトを参照している場合、メンバオブジェクト はコピーされ、登録されたコールバックは呼び出されました。 |
何もしない この場合に |