Espacios de nombres
Variantes
Acciones

std::ios_base::xalloc

De cppreference.com
< cpp‎ | io‎ | ios base
 
 
 
 
static int xalloc();

Devuelve un valor de índice único (para todo el programa) que se puede utilizar para acceder a un elemento long y un elemento void* en el almacenamiento privado de std::ios_base llamando a iword() y pword(). La llamada a xalloc no asigna memoria.

Esta función es segura para hilos; el acceso simultáneo de varios hilos no da como resultado una carrera de datos. (desde C++14)

Incrementa efectivamente un dato miembro estático privado de std::ios_base, como si se ejecutara return index++;, si index es el nombre de ese miembro estático (que puede ser std::atomic para admitir el acceso simultáneo de varios hilos o sincronizarse de otro modo) (desde C++14).

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

Un entero único para usar como índice de pword/iword.

[editar] Ejemplo

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

#include <iostream>
 
template<class CharT, class Traits = std::char_traits<CharT> >
class mi_flujo : public std::basic_ostream<CharT, Traits>
{
public:
    static const int xindex;
 
    mi_flujo(std::basic_ostream<CharT, Traits>& ostr) :
        std::basic_ostream<CharT, Traits>(ostr.rdbuf())
    {
        this->pword(xindex) = this;
    }
 
    void mi_funcion()
    {
        *this << "[manejo especial para mi_flujo]";
    }
};
 
// Cada especialización de mi_flujo obtiene un índice único de xalloc()
template<class CharT, class Traits>
const int mi_flujo<CharT, Traits>::xindex = std::ios_base::xalloc();
 
// Este manipulador de E/S podrá reconocer ostreams que sean de tipo mi_flujo
// buscando el puntero almacenado en pword.
template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>& mi_manipulador(std::basic_ostream<CharT, Traits>& os)
{
    if (os.pword(mi_flujo<CharT, Traits>::xindex) == &os)
        static_cast<mi_flujo<CharT, Traits>&>(os).mi_funcion();
    return os;
}
 
int main()
{
    std::cout << "cout, prueba de caracteres estrechos  " << mi_manipulador << '\n';
 
    mi_flujo<char> mi_salida(std::cout);
    mi_salida << "mi_salida, prueba de caracteres estrechos  " << mi_manipulador << '\n';
 
    std::wcout << "wcout, prueba de caracteres anchos  " << mi_manipulador << '\n';
 
    mi_flujo<wchar_t> mi_salida_ancha(std::wcout);
    mi_salida_ancha << "mi_salida_ancha, prueba de caracteres anchos  " << mi_manipulador << '\n';
}

Salida:

cout, prueba de caracteres estrechos 
mi_salida, prueba de caracteres estrechos  [manejo especial para mi_flujo]
wcout, prueba de caracteres anchos 
mi_salida_ancha, prueba de caracteres anchos  [manejo especial para mi_flujo]

[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) [editar]
Cambia el tamaño del almacenamiento privado si es necesario y accede al elemento long en el índice dado.
(función miembro pública) [editar]