std::basic_ios<CharT,Traits>:: copyfmt
|
basic_ios
&
copyfmt
(
const
basic_ios
&
other
)
;
|
||
other が * this と同じオブジェクトを参照している場合、効果はない。それ以外の場合、 other のストリーム状態を * this にコピーする。これは以下の順序で行われる:
iword
および
pword
ポインタ自体は除く)、コールバック、および関連付けられたストリームのコピーを作成する。
目次 |
パラメータ
| other | - | ソースとして使用する別のストリーム |
戻り値
* this
注記
コールバックの2回目の通過は、 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); // rdstateとrdbuf以外のすべてをコピー out.clear(std::cout.rdstate()); // rdstateをコピー out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // バッファを共有 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); // rdstateと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
と同じオブジェクトを参照する場合でも、
メンバオブジェクトがコピーされ、 登録済みコールバックが呼び出されていた |
この場合は
何もしない |