std::ios_base::iword
long& iword( int index ); |
||
Primero asigna o cambia el tamaño del almacenamiento privado (array dinámico de long u otra estructura de datos indexables) lo suficiente como para hacer de index
un índice válido, luego devuelve una referencia al elemento long del almacenamiento privado con el índice index
.
La referencia puede quedar invalidada por cualquier operación en este objeto ios_base
, incluida otra llamada a iword()
, pero los valores almacenados se conservan, de modo que la lectura de iword(index) con el mismo índice más tarde producirá el mismo valor hasta la próxima llamada a std::basic_ios::copyfmt(). El valor se puede utilizar para cualquier propósito. El índice del elemento debe obtenerse mediante una llamada previa a xalloc(), de lo contrario el comportamiento no está definido. Los nuevos elementos se inicializan en 0.
Si la función falla (posiblemente debido a un error de asignación) y *this es un subobjeto de clase base de un objeto o subobjeto basic_ios<>
, llama a std::basic_ios <>::setstate(badbit) que puede generar std::ios_base::failure.
Contenido |
[editar] Parámetros
index | - | El valor del índice del elemento. |
[editar] Valor de retorno
Una referencia al elemento.
[editar] Excepciones
Puede lanzar std::ios_base::failure al establecer badbit
.
[editar] Notas
El uso típico del almacenamiento de iword
es pasar información (por ejemplo, indicadores de formato personalizados) desde manipuladores de E/S definidos por el usuario a operator<<
y operator>>
definidos por el usuario o a facetas de formato definidas imbuidas en flujos estándar.
[editar] Ejemplo
#include <iostream> #include <string> struct Foo { static int foo_xalloc; std::string datos; Foo(const std::string& s) : datos(s) {} }; // asigna el almacenamiento de iword para su uso con objetos Foo int Foo::foo_xalloc = std::ios_base::xalloc(); // Este operator<< definido por el usuario imprime la cadena al revés si iword contiene 1 std::ostream& operator<<(std::ostream& os, Foo& f) { if(os.iword(Foo::foo_xalloc) == 1) return os << std::string(f.datos.rbegin(), f.datos.rend()); else return os << f.datos; } // Este manipulador de E/S invierte el número almacenado en iword entre 0 y 1 std::ios_base& inversor(std::ios_base& os) { os.iword(Foo::foo_xalloc) = !os.iword(Foo::foo_xalloc); return os; } int main() { Foo f("ejemplo"); std::cout << f << '\n' << inversor << f << '\n' << inversor << f << '\n'; }
Salida:
ejemplo olpmeje ejemplo
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 36 | C++98 | Era posible que el valor almacenado no se conservara si la referencia se invalidaba. | El valor almacenado se conserva hasta la próxima llamada a copyfmt() .
|
LWG 41 | C++98 | La función establecía badbit por sí sola en caso de fracaso,pero ios_base no proporcionaba dicha interfaz.
|
badbit se establece mediante basic_ios (si *this es su subobjeto de clase base). |
[editar] Véase también
Cambia el tamaño del almacenamiento privado si es necesario y el acceso al elemento void* en el índice dado. (función miembro pública) | |
[estático] |
Devuelve un entero único para todo el programa que es seguro de usar como índice para pword() e iword() (función miembro estática pública) |