std::ios_base::xalloc
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).
Parámetros
(Ninguno)
Valor de retorno
Un entero único para usar como índice de pword/iword.
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]
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) | |
Cambia el tamaño del almacenamiento privado si es necesario y accede al elemento long en el índice dado. (función miembro pública) |