std::basic_ios<CharT,Traits>:: copyfmt
|
basic_ios
&
copyfmt
(
const
basic_ios
&
other
)
;
|
||
Если other ссылается на тот же объект, что и * this , не имеет эффекта. В противном случае копирует состояние потока other в * this . Это выполняется в следующей последовательности:
iword
и
pword
), колбэков и связанного потока.
Содержание |
Параметры
| 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
, члены-объекты
все равно копировались и зарегистрированные обратные вызовы все равно вызывались |
ничего не делать
в этом случае |