std::ios_base::iword
long& iword( int index ); |
Сначала выделяет или изменяет размер закрытого хранилища (динамического массива из long или другой индексируемой структуры данных) так, чтобы index был допустимым индексом, а затем возвращает ссылку на элемент long закрытого хранилища с индексом index.
Ссылка может стать недействительной в результате любой операции над этим объектом ios_base, включая другой вызов iword(), однако сохранённые значения остаются прежними, поэтому чтение из iword(index) с тем же индексом позднее вернёт то же значение до следующего вызова std::basic_ios::copyfmt(). Значение можно использовать для любых целей. Индекс элемента необходимо получить предварительным вызовом xalloc(), иначе поведение не определено. Новые элементы инициализируются значением 0.
Если функция завершается с ошибкой (возможно, из-за сбоя выделения памяти), а *this является подобъектом базового класса объекта или подобъекта basic_ios<>, вызывается std::basic_ios<>::setstate(badbit), который может выбросить исключение std::ios_base::failure.
Примечания
Обычно хранилище iword используется для передачи информации (например, пользовательских флагов форматирования) от определённых пользователем манипуляторов ввода-вывода определённым пользователем operator<< и operator>> или определённым пользователем фасетам форматирования, добавленным в стандартные потоки.
Параметры
| index | - | значение индекса элемента |
Возвращаемое значение
Ссылка на элемент.
Исключения
Может выбросить исключение std::ios_base::failure при установке badbit.
Пример
#include <iostream>
#include <string>
struct Foo
{
static int foo_xalloc;
std::string data;
Foo(const std::string& s) : data(s) {}
};
// Allocates the iword storage for use with Foo objects
int Foo::foo_xalloc = std::ios_base::xalloc();
// This user-defined operator<< prints the string in reverse if the iword holds 1
std::ostream& operator<<(std::ostream& os, Foo& f)
{
if (os.iword(Foo::foo_xalloc) == 1)
return os << std::string(f.data.rbegin(), f.data.rend());
else
return os << f.data;
}
// This I/O manipulator flips the number stored in iword between 0 and 1
std::ios_base& rev(std::ios_base& os)
{
os.iword(Foo::foo_xalloc) = !os.iword(Foo::foo_xalloc);
return os;
}
int main()
{
Foo f("example");
std::cout << f << '\n' << rev << f << '\n' << rev << f << '\n';
}
Вывод:
example elpmaxe example
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применялся к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 36 | C++98 | сохранённое значение могло не сохраняться, если ссылка становилась недействительной | сохранённое значение сохраняется до следующего вызова copyfmt() |
| LWG 41 | C++98 | при сбое функция самостоятельно устанавливала badbit, но ios_base не предоставляет такого интерфейса | badbit устанавливается функцией basic_ios(если *this является её подобъектом базового класса) |
См. также
| при необходимости изменяет размер закрытого хранилища и предоставляет доступ к элементу void* с заданным индексом (открытая функция-член) |
|
|
[static] | возвращает уникальное в пределах программы целое число, которое безопасно использовать в качестве индекса для pword() и iword() (открытая статическая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/ios_base/iword