| I/O manipulators | ||||
| Print functions(C++23) | ||||
| C-style I/O | ||||
| Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
| Streams | ||||
| Abstractions | ||||
| File I/O | ||||
| String I/O | ||||
| Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
| Synchronized Output | ||||
(C++20) | ||||
| Types | ||||
| Error category interface | ||||
(C++11) | ||||
(C++11) |
| Member functions | ||||
| Formatting | ||||
| Locales | ||||
| Internal extensible array | ||||
ios_base::xalloc | ||||
| Miscellaneous | ||||
| Member classes | ||||
| Member types | ||||
staticint xalloc(); | ||
Returns a unique (program-wide) index value that can be used to access onelong and onevoid* elements in the private storage ofstd::ios_base by callingiword() andpword(). The call toxalloc does not allocate memory.
This function is thread-safe: concurrent access by multiple threads does not result in a data race. | (since C++11) |
Effectively increments the next available unique index.
Contents |
Unique integer for use as pword/iword index.
Uses base class pword storage for runtime type identification of derived stream objects.
#include <iostream> template<class CharT,class Traits=std::char_traits<CharT>>class mystream:publicstd::basic_ostream<CharT, Traits>{public:staticconstint 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>constint 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 pwordtemplate<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 testmyout, narrow-character test [special handling for mystream]wcout, wide-character testmywout, wide-character test [special handling for mystream]
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 |
| resizes the private storage if necessary and access to thevoid* element at the given index (public member function)[edit] | |
| resizes the private storage if necessary and access to thelong element at the given index (public member function)[edit] |