Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
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 ac-
       cess one	long and
	  one void* elements in	the private storage of std::ios_base by	 call-
       ing 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 de-
       rived 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  xal-
       loc()
	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 retroac-
       tively 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)

http://cppreference.com		  2024.06.10	      std::ios_base::xalloc(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ios_base::xalloc&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help