Scroll to navigation

std::ios_base::xalloc(3) C++ Standard Libary std::ios_base::xalloc(3)

NAME

std::ios_base::xalloc - std::ios_base::xalloc

Synopsis


static int xalloc();


Returns a unique (program-wide) index value that can be used to access one long and
one void* elements in the private storage of std::ios_base by calling iword() and
pword(). The call to xalloc does not allocate memory.


This function is thread-safe: concurrent access by multiple threads (since C++11)
does not result in a data race.


Effectively increments the next available unique index.

Return value


Unique integer for use as pword/iword index.

Example


Uses base class pword storage for runtime type identification of derived stream
objects.

// Run this code


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

Output:


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


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
LWG 2143 C++11 xalloc was not thread-safe made thread-safe

See also


resizes the private storage if necessary and access to the void* element at
pword the given index
(public member function)
resizes the private storage if necessary and access to the long element at the
iword given index
(public member function)

2024.06.10 http://cppreference.com