Namespaces
Variants

std::ios_base:: iword

From cppreference.net
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>> или к пользовательским фасетам форматирования, внедренным в стандартные потоки.

Параметры

индекс - значение индекса элемента

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

Ссылка на элемент.

Исключения

Может выбросить 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) {}
};
// Выделяет хранилище iword для использования с объектами Foo
int Foo::foo_xalloc = std::ios_base::xalloc();
// Этот пользовательский operator<< выводит строку в обратном порядке, если iword содержит 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;
}
// Этот манипулятор ввода-вывода переключает число, хранящееся в iword, между 0 и 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 Applied to Behavior as published Correct behavior
LWG 36 C++98 сохраненное значение может не сохраняться,
если ссылка становится недействительной
сохраненное значение сохраняется
до следующего вызова copyfmt()
LWG 41 C++98 функция самостоятельно устанавливает badbit при ошибке,
но ios_base не предоставляет такой интерфейс
badbit устанавливается basic_ios
(если * this является его базовым подобъектом)

Смотрите также

изменяет размер приватного хранилища при необходимости и предоставляет доступ к void * элементу по заданному индексу
(публичная функция-член)
[static]
возвращает уникальное для всей программы целое число, которое безопасно использовать в качестве индекса для pword() и iword()
(публичная статическая функция-член)