Spec-Zone.ru › C++

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 является подклассом базового объекта)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/ios_base/iword

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API