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.
Parámetros
| index | - | El valor del índice del elemento. |
Valor de retorno
Una referencia al elemento.
Excepciones
Puede lanzar std::ios_base::failure al establecer badbit.
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.
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
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).
|
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) |