std::ios_base:: pword
|
void
*
&
pword
(
int
index
)
;
|
||
まず、プライベートストレージ(動的配列の void * または他のインデックス可能なデータ構造)を割り当てるかサイズ変更し、 index が有効なインデックスとなるように十分な容量を確保します。その後、 void * 要素のプライベートストレージ内でインデックス index に対応する要素への参照を返します。
この参照は、この
ios_base
オブジェクトに対するあらゆる操作(別の
pword()
の呼び出しを含む)によって無効化される可能性がありますが、保存された値は保持されるため、後で同じインデックスで
pword
(
index
)
から読み取ると、次に
std::basic_ios::copyfmt()
が呼び出されるまで同じ値が得られます。この値は任意の目的に使用できます。要素のインデックスは
xalloc()
によって取得されなければならず、そうでない場合の動作は未定義です。新しい要素は
nullポインタ
で初期化されます。
関数が失敗した場合(おそらくアロケーションの失敗が原因)、かつ
*
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
はそのようなインターフェースを提供しない
|
badbitは
basic_ios
によって設定される
( * this がその基底クラス部分オブジェクトである場合) |
関連項目
|
必要に応じてプライベートストレージをリサイズし、指定されたインデックスの
long
要素にアクセスする
(public member function) |
|
|
[static]
|
pword()
および
iword()
のインデックスとして使用するのに安全な、プログラム全体で一意の整数を返す
(public static member function) |