std::ios_base::pword
| void*& pword( int index ); |
||
Allokiert oder vergrößert den privaten Speicher (dynamisches Array von void* oder einer anderen indizierbaren Datenstruktur), so dass index ein gültiger Index ist, und gibt dann eine Referenz auf das void*-Element des privaten Speichers mit dem Index index zurück.
Die Referenz kann durch jede Operation an diesem ios_base-Objekt ungültig werden, einschließlich eines weiteren Aufrufs von pword(). Die gespeicherten Werte bleiben jedoch erhalten, sodass das Lesen von pword(index) mit demselben Index später denselben Wert ergibt, bis zum nächsten Aufruf von std::basic_ios::copyfmt(). Der Wert kann für jeden Zweck verwendet werden. Der Index des Elements muss durch xalloc() erhalten werden, andernfalls ist das Verhalten undefiniert. Neue Elemente werden mit einem Nullzeiger initialisiert.
Wenn die Funktion fehlschlägt (möglicherweise aufgrund eines Speicherzuordnungsfehlers) und *this ein Basisklassen-Unterobjekt eines basic_ios<>-Objekts oder -Unterobjekts ist, wird std::basic_ios<>::setstate(badbit) aufgerufen, was std::ios_base::failure auslösen kann.
Inhalt |
[bearbeiten] Parameter
| index | - | index Wert des Elements |
[bearbeiten] Rückgabewert
Ein Verweis auf das Element.
[bearbeiten] Ausnahmen
Kann std::ios_base::failure auslösen, wenn das badbit gesetzt wird.
[bearbeiten] Hinweise
Wenn die in pword gespeicherten Zeiger eine Verwaltung erfordern, kann register_callback() verwendet werden, um Handler zu installieren, die eine tiefe Kopie oder Dekallocation nach Bedarf ausführen.
[bearbeiten] Beispiel
Verwendet den pword-Speicher der Basisklasse zur Laufzeit-Typidentifikation von abgeleiteten Stream-Objekten.
#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'; }
Ausgabe
cout, narrow-character test myout, narrow-character test [special handling for mystream] wcout, wide-character test mywout, wide-character test [special handling for mystream]
[bearbeiten] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 36 | C++98 | der gespeicherte Wert wird möglicherweise nicht beibehalten, wenn die Referenz ungültig wird |
der gespeicherte Wert wird beibehalten bis zum nächsten Aufruf von copyfmt() |
| LWG 41 | C++98 | die Funktion setzt badbit bei Fehler selbst, aber ios_base stellt keine solche Schnittstelle bereit |
badbit wird von basic_ios gesetzt(wenn *this sein Basisklassen-Unterobjekt ist) |
[bearbeiten] Siehe auch
| vergrößert den privaten Speicher bei Bedarf und greift auf das long-Element am gegebenen Index zu (öffentliche Memberfunktion) | |
| [static] |
gibt eine programmintern eindeutige Ganzzahl zurück, die sicher als Index für pword() und iword() verwendet werden kann (öffentliche statische Memberfunktion) |