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/cpp/io/ios_base/iword

Spec-Zone.ru

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