std::ios_base::pword
| void*& pword( int index ); |
||
まず、`index` を有効なインデックスにするために、プライベートストレージ(`void*` の動的配列またはその他のインデックス可能なデータ構造)を割り当てるかリサイズし、次に、そのプライベートストレージの `void*` 要素で `index` のインデックスを持つ要素への参照を返します。
この参照は、この `ios_base` オブジェクトに対する他の操作(`pword()` の別の呼び出しを含む)によって無効になる可能性がありますが、格納されている値は保持されるため、後で同じインデックスで `pword(index)` から読み取ると、`std::basic_ios::copyfmt()` が次に呼び出されるまで、同じ値が得られます。この値は任意の目的に使用できます。要素のインデックスは、`xalloc()` によって取得する必要があり、それ以外の場合は未定義の動作となります。新しい要素はヌルポインタに初期化されます。
関数が失敗した場合(割り当ての失敗が原因である可能性があります)で、`*this` が `basic_ios<>` オブジェクトまたはサブオブジェクトの基底クラスサブオブジェクトである場合、`std::basic_ios<>::setstate(badbit)` が呼び出され、`std::ios_base::failure` がスローされる可能性があります。
目次 |
[編集] パラメータ
| index | - | 要素のインデックス値 |
[編集] 戻り値
要素への参照。
[編集] 例外
badbit を設定するときに `std::ios_base::failure` をスローする可能性があります。
[編集] 注釈
`pword` に格納されているポインタが管理を必要とする場合、`register_callback()` を使用して、必要に応じてディープコピーまたは解放を実行するハンドラをインストールできます。
[編集] 例
派生ストリームオブジェクトの実行時型識別のために、基底クラスの pword ストレージを使用します。
#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'; }
出力
cout, narrow-character test myout, narrow-character test [special handling for mystream] wcout, wide-character test mywout, wide-character test [special handling for mystream]
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 36 | C++98 | 参照が無効になった場合、格納された値が保持されない可能性があります。 参照が無効になった場合 |
格納された値は保持されます `copyfmt()` の次の呼び出しまで |
| LWG 41 | C++98 | 関数は失敗時に badbit を自分で設定しますが、`ios_base` はそのようなインターフェースを提供しません。 `ios_base` はそのようなインターフェースを提供しません |
badbit は `basic_ios` によって設定されます (`*this` がその基底クラスサブオブジェクトである場合) |
[編集] 関連情報
| 必要に応じてプライベートストレージのサイズを変更し、指定されたインデックスの long 要素にアクセスする (public メンバ関数) | |
| [static] |
`pword()` および `iword()` のインデックスとして安全に使用できる、プログラム全体で一意な整数を返します。 (public static メンバ関数) |