Namespaces
Variants

std::basic_ios<CharT,Traits>:: copyfmt

From cppreference.net
basic_ios & copyfmt ( const basic_ios & other ) ;

other * this と同じオブジェクトを参照している場合、効果はない。それ以外の場合、 other のストリーム状態を * this にコピーする。これは以下の順序で行われる:

1) register_callback() によって登録されたすべてのコールバックを呼び出し、 erase_event をパラメータとして渡します。
2) other から全てのメンバオブジェクトを * this にコピーする。ただし rdstate() 、例外マスク、および rdbuf() は除く。具体的には、ロケール、書式フラグ、 std::ios_base::iword および std::ios_base::pword 配列の内容(ただし iword および pword ポインタ自体は除く)、コールバック、および関連付けられたストリームのコピーを作成する。
3) register_callback() によって登録されたすべてのコールバックを呼び出し、 copyfmt_event をパラメータとして渡します。
4) other から例外マスクを * this にコピーします。これは exceptions ( other. exceptions ( ) ) を呼び出すのと同様です。

目次

パラメータ

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 と同じオブジェクトを参照する場合でも、
メンバオブジェクトがコピーされ、
登録済みコールバックが呼び出されていた
この場合は
何もしない