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 {staticint foo_xalloc;std::string datos; Foo(conststd::string& s): datos(s){}}; // asigna el almacenamiento de iword para su uso con objetos Fooint Foo::foo_xalloc= std::ios_base::xalloc(); // Este operator<< definido por el usuario imprime la cadena al revés si iword contiene 1std::ostream& operator<<(std::ostream& os, Foo& f){if(os.iword(Foo::foo_xalloc)==1)return os <<std::string(f.datos.rbegin(), f.datos.rend());elsereturn os << f.datos;} // Este manipulador de E/S invierte el número almacenado en iword entre 0 y 1std::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) |