std::basic_ios<CharT,Traits>::copyfmt
basic_ios& copyfmt( const basic_ios& other ); |
Если other ссылается на тот же объект, что и *this, никакого действия не происходит. В противном случае, копирует состояние потока other в *this. Это выполняется в следующей последовательности:
register_callback() обратные вызовы, передавая в качестве параметра erase_event.other в *this за исключением rdstate(), маски исключений и rdbuf(). В частности, производятся копии локали, флагов форматирования, содержимого массивов std::ios_base::iword и std::ios_base::pword (но не сами указатели iword и pword), обратных вызовов и связанного потока.register_callback() обратные вызовы, передавая в качестве параметра copyfmt_event.other в *this так, как если бы вызвалась функция exceptions(other.exceptions()).Параметры
| other | - | другой поток, используемый в качестве источника |
Возвращаемое значение
*this
Примечания
Второй проход через обратные вызовы может быть использован для глубокой копии пользовательских объектов, на которые указывают указатели в std::ios_base::pword.
copyfmt() может быть использован для сохранения и восстановления состояния потока. Boost предоставляет более тонкую библиотеку сохранителей состояния ввода-вывода для той же цели.
Пример
Делает объект 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 | Применено к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| LWG 256 | C++98 | шаг 3 вызывал зарегистрированные обратные вызовы с типом события copy_event, который не определён | исправлено наcopyfmt_event |
| LWG 292 | C++98 | если other ссылается на тот же объект, что и *this, члены объекта всё равно копировались, а зарегистрированные обратные вызовы всё равно вызывались | ничего не делать в этом случае |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_ios/copyfmt