long& iword(int idx);
概要
long
型の私用記憶域への参照を取得する。
効果
idx
で指定した記憶域がまだ確保されていなかった場合、新たに long
型の記憶域を確保し、0
で初期化する。
もし、記憶域の確保に失敗し、かつ、*this
が basic_ios
の基底サブオブジェクトの場合、basic_ios::setstate(badbit)
を呼び出す(これは failure
例外を送出するかもしれない)。
戻り値
idx
で指定した記憶域への参照。もし記憶域が確保できなかった場合(かつfailure
例外が投げられなかった場合)には、0
に初期化された有効な long
型への参照。
備考
- 引数
idx
には、xalloc
で取得した値を渡すことが想定されている。 そうすることによって、各プログラムが他のプログラムと競合すること無く各ストリームオブジェクト内にlong
型の私用記憶域を確保することが可能となる。 - 本関数で取得した
long
への参照は、本オブジェクトの他の操作によって無効になる可能性がある。
しかし、その場合でも引数idx
で指定した記憶域の内容は依然として有効である。 - 本関数で取得した
long
型の記憶域の内容は、basic_ios::copyfmt
でコピーされる。
例
#include <iostream>
#include <string>
#include <sstream>
// 任意の基数で出力可能な unsigned 型
struct MyUnsigned {
unsigned value;
};
// 基数を指定するためのマニピュレータ
struct setradix {
explicit setradix(int radix) : radix(radix) {}
friend std::ostream& operator<<(std::ostream& os, const MyUnsigned& x);
friend std::ostream& operator<<(std::ostream& os, const setradix& manip);
private:
int radix;
static const int index;
};
// 記憶域用の添え字を取得
const int setradix::index = std::ios_base::xalloc();
// MyUnsigned 用の出力演算子
std::ostream& operator<<(std::ostream& os, const MyUnsigned& x)
{
long radix = os.iword(setradix::index);
if (radix == 0) {
radix = 10;
}
std::string s;
unsigned n = x.value;
do {
s.insert(0, 1, '0' + n % radix);
n /= radix;
} while (n != 0);
return os << s;
}
// マニピュレータ用の出力演算子
std::ostream& operator<<(std::ostream& os, const setradix& manip)
{
long& radix = os.iword(setradix::index);
if (!os.bad()) {
radix = manip.radix;
}
return os;
}
int main()
{
MyUnsigned x = {10};
std::cout << x << std::endl; // 10 進数として普通に出力
std::cout << setradix(7) << x << std::endl; // 7 進数として出力
std::stringstream ss;
ss << setradix(3); // ss に基数 3 を設定
std::cout.copyfmt(ss); // ss から std::cout にフォーマットをコピー
std::cout << x << std::endl; // 3 進数として出力
}
出力
10
13
101