マニピュレータ

例えばCだと

  printf("[%08x]\n", n);

と書けるところが、C++だと

  std::cout << '[' << std::hex << std::setfill('0') << std::setw(8) << n << ']' << std::endl;

とか書かないといけないのだが、こんなコードを何回も書いてるうちにやってられない気分になったので、C++マニアック,マニピュレータの作り方,how to make manipulatorを参考にして、独自のマニピュレータを定義してみた。

#include <iostream>
#include <iomanip>

template<typename TA, typename TB = int>
class HexManip {
  friend std::ostream & operator <<(std::ostream & ros, HexManip manip) {
    return manip(ros);
  }
private:
  TB val;
public:
  HexManip(TB val_) { val = val_; }
private:
  std::ostream & operator()(std::ostream & ros) {
    return ros << std::hex
               << std::setfill('0')
               << std::setw(sizeof(TA) * 2)
               << (val & TA(-1));
  }
};

typedef HexManip<unsigned char> HexByte;
typedef HexManip<unsigned short> HexWord;
typedef HexManip<unsigned int> HexDWord;

int main(int argc, char * argv[]) {
  std::cout << HexByte(-1) << std::endl;
  std::cout << HexWord(1) << std::endl;
  std::cout << HexDWord(0x80000000) << std::endl;

  return 0;
}

実行結果

% ./a.out
ff
0001
80000000

そもそもこんなコードを何回も書かないといけないという時点で相当限定された状況なので、どれだけ一般的に使えるか分からないけど。