std::ios_base:: pword
|
void
*
&
pword
(
int
index
)
;
|
||
Сначала выделяет или изменяет размер приватного хранилища (динамического массива void * или другой индексируемой структуры данных) достаточно, чтобы сделать index допустимым индексом, затем возвращает ссылку на void * элемент приватного хранилища с индексом index .
Ссылка может стать недействительной при любой операции с этим объектом
ios_base
, включая другой вызов
pword()
, но сохраненные значения сохраняются, так что последующее чтение из
pword
(
index
)
с тем же индексом будет возвращать то же значение до следующего вызова
std::basic_ios::copyfmt()
. Значение может использоваться для любых целей. Индекс элемента должен быть получен с помощью
xalloc()
, иначе поведение не определено. Новые элементы инициализируются
нулевым указателем
.
Если функция завершается неудачно (возможно, из-за ошибки выделения памяти) и
*
this
является базовым подобъектом объекта
basic_ios<>
или подобъекта, вызывает
std::
basic_ios
<>
::
setstate
(
badbit
)
, что может вызвать исключение
std::ios_base::failure
.
Содержание |
Параметры
| индекс | - | значение индекса элемента |
Возвращаемое значение
Ссылка на элемент.
Исключения
Может выбросить std::ios_base::failure при установке badbit.
Примечания
Если указатели, хранящиеся в
pword
требуют управления,
register_callback()
может быть использован для установки обработчиков, которые выполняют глубокое копирование или освобождение памяти по мере необходимости.
Пример
Использует хранилище pword базового класса для идентификации типа производных потоковых объектов во время выполнения.
#include <iostream> template<class CharT, class Traits = std::char_traits<CharT>> class mystream : public std::basic_ostream<CharT, Traits> { public: static const int xindex; mystream(std::basic_ostream<CharT, Traits>& ostr) : std::basic_ostream<CharT, Traits>(ostr.rdbuf()) { this->pword(xindex) = this; } void myfn() { *this << "[special handling for mystream]"; } }; // Each specialization of mystream obtains a unique index from xalloc() template<class CharT, class Traits> const int mystream<CharT, Traits>::xindex = std::ios_base::xalloc(); // This I/O manipulator will be able to recognize ostreams that are mystreams // by looking up the pointer stored in pword template<class CharT, class Traits> std::basic_ostream<CharT, Traits>& mymanip(std::basic_ostream<CharT, Traits>& os) { if (os.pword(mystream<CharT, Traits>::xindex) == &os) static_cast<mystream<CharT, Traits>&>(os).myfn(); return os; } int main() { std::cout << "cout, narrow-character test " << mymanip << '\n'; mystream<char> myout(std::cout); myout << "myout, narrow-character test " << mymanip << '\n'; std::wcout << "wcout, wide-character test " << mymanip << '\n'; mystream<wchar_t> mywout(std::wcout); mywout << "mywout, wide-character test " << mymanip << '\n'; }
Вывод:
cout, narrow-character test myout, narrow-character test [special handling for mystream] wcout, wide-character test mywout, wide-character test [special handling for mystream]
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам 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 является его базовым подобъектом) |
Смотрите также
|
изменяет размер приватного хранилища при необходимости и предоставляет доступ к
long
элементу по заданному индексу
(публичная функция-член) |
|
|
[static]
|
возвращает уникальное для всей программы целое число, которое безопасно использовать в качестве индекса для
pword()
и
iword()
(публичная статическая функция-член) |