Namespaces
Variants

std::ios_base:: pword

From cppreference.net
void * & pword ( int index ) ;

Primero, asigna o redimensiona el almacenamiento privado (arreglo dinámico de void * u otra estructura de datos indexable) lo suficiente para hacer que index sea un índice válido, luego devuelve una referencia al elemento void * del almacenamiento privado con el índice index .

La referencia puede ser invalidada por cualquier operación en este ios_base objeto, incluyendo otra llamada a pword() , pero los valores almacenados se conservan, de modo que leer desde pword ( index ) con el mismo índice posteriormente producirá el mismo valor hasta la siguiente llamada a std::basic_ios::copyfmt() . El valor puede utilizarse para cualquier propósito. El índice del elemento debe obtenerse mediante xalloc() , de lo contrario el comportamiento es indefinido. Los nuevos elementos se inicializan a un puntero nulo .

Si la función falla (posiblemente debido a un fallo de asignación) y * this es un subobjeto de clase base de un objeto basic_ios<> o subobjeto, llama a std:: basic_ios <> :: setstate ( badbit ) lo cual puede lanzar std::ios_base::failure .

Contenidos

Parámetros

índice - valor del índice del elemento

Valor de retorno

Una referencia al elemento.

Excepciones

Puede lanzar std::ios_base::failure al establecer el badbit.

Notas

Si los punteros almacenados en pword requieren gestión, register_callback() puede usarse para instalar manejadores que ejecuten copia profunda o liberación de memoria según sea necesario.

Ejemplo

Utiliza el almacenamiento pword de la clase base para la identificación del tipo en tiempo de ejecución de objetos de flujo derivados.

#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';
}

Salida:

cout, narrow-character test
myout, narrow-character test [special handling for mystream]
wcout, wide-character test
mywout, wide-character test [special handling for mystream]

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 36 C++98 el valor almacenado podría no
conservarse si la referencia se invalida
el valor almacenado se conserva
hasta la siguiente llamada de copyfmt()
LWG 41 C++98 la función establecía badbit por sí misma en caso de fallo,
pero ios_base no proporciona dicha interfaz
badbit es establecido por basic_ios
(si * this es su subobjeto de clase base)

Véase también

redimensiona el almacenamiento privado si es necesario y accede al long elemento en el índice dado
(función miembro pública)
[static]
devuelve un entero único en todo el programa que es seguro usar como índice para pword() y iword()
(función miembro estática pública)