最終更新日時:
が更新

履歴 編集

function
<ios>

std::ios_base::iword

long& iword(int idx);

概要

long 型の私用記憶域への参照を取得する。

効果

idx で指定した記憶域がまだ確保されていなかった場合、新たに long 型の記憶域を確保し、0 で初期化する。 もし、記憶域の確保に失敗し、かつ、*thisbasic_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

参照