Namespaces
Variants

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

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

Если other ссылается на тот же объект, что и * this , не имеет эффекта. В противном случае копирует состояние потока other в * this . Это выполняется в следующей последовательности:

1) Вызывает каждый callback, зарегистрированный с помощью register_callback() передавая erase_event в качестве параметра.
2) Копирует все объекты-члены из other в * this за исключением rdstate() , маски исключений и rdbuf() . В частности, создает копии локали, флагов форматирования, содержимого массивов std::ios_base::iword и std::ios_base::pword (но не самих указателей iword и pword ), колбэков и связанного потока.
3) Вызывает каждый callback, зарегистрированный с помощью register_callback() передавая copyfmt_event в качестве параметра.
4) Копирует маску исключений из other в * this как если бы вызывался exceptions ( other. exceptions ( ) ) .

Содержание

Параметры

other - другой поток для использования в качестве источника

Возвращаемое значение

* 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++.

DR Applied to Behavior as published Correct behavior
LWG 256 C++98 шаг 3 вызывал зарегистрированные обратные вызовы с
типом события copy_event , который не определен
исправлено на
copyfmt_event
LWG 292 C++98 если other ссылается на тот же объект, что и * this , члены-объекты
все равно копировались и зарегистрированные обратные вызовы все равно вызывались
ничего не делать
в этом случае