Top/article/Arbitrary-formatting-by-overloading-stream-op
English | Japanese
English | Japanese

Menu

  • Top
  • Akihiko Yamaguchi 山口 明彦
  • Project プロジェクト
  • Text テキスト
  • Recent articles 最近の記事
  • Articles 記事一覧 (a to z)
  • Search 検索

Tags タグ †

  • [c++][bash][python][latex][php]
  • [linux][windows][mac][android]
  • [math][algorithm][idea][trick]
  • [liboctave][opencv][git][ros]
  • [setting][bug][general]
↑

Recent articles 最近の記事 †

2019-07-02
  • article/Display-Unix-Time
  • article/Synchronize-Linux-Time-to-Remote
2018-09-27
  • article/python-multimode-singleton
2018-09-02
  • article/rosinstall-git-default-remote
2017-07-28
  • article/SubMenu
2017-03-05
  • article/Import-a-different-version-of-OpenCV-in-Python
2015-08-17
  • article/DRC-finals-2015
2015-01-05
  • article/Upgrade-Android-to-Lollipop
2015-01-01
  • article/Kernel-panic-of-Linux-when-using-Xtion
  • article/Do-not-skip-freeing-data-when-using-tri-mesh-in-ODE
Access: 1/2479 - Admin
These search terms have been highlighted:[c++]

Arbitrary formatting by overloading operator<<

operator<<をオーバーロードして任意書式

[c++][trick]
2009-06-28

シリアル通信のプログラムなどでは,多くの場合 unsigned char の配列にデータを保存する.このようなデータを16進数で標準出力に表示する場合, operator<< をオーバーロードすると便利だ.しかし,単純に unsigned char* に対してオーバーロードすると,オリジナルの (iostream で宣言されているのと) コンフリクトする.以下では,既にある operator<< と整合性を取りつつ,任意に書式設定する方法について解説する.

アイディア †

基本的なアイディアは,

  1. 出力対象の変数 (上の例では unsigned char*) を含む構造体を定義し,コンストラクタで出力対象の変数を代入できるようにする
  2. operator<< を定義した構造体に対してオーバーロードする

というもの.ここで定義する構造体のコンストラクタに,書式設定のパラメタを持たせることもできる.

↑

サンプル †

次のプログラムでは,unsigned char* の変数を含む構造体 echo_uschar を定義し,operator<< を echo_uschar に対してオーバーロードしている.

#include <iomanip>
using namespace std;

struct echo_uschar
{
  const unsigned char *s;
  int n;
  const char *delim;
  echo_uschar(const unsigned char *_s,int _n,const char *_delim=" ")
    : s(_s), n(_n), delim(_delim) {};
};
ostream& operator<< (ostream &lhs, const echo_uschar &rhs)
{
  for (int i(0);i<rhs.n;++i)
    lhs<<rhs.delim<<setw(2)<<setfill('0')<<hex<<static_cast<int>(rhs.s[i])<<dec;
  return lhs;
};

int main(int argc,char**argv)
{
  unsigned char data[]= {0x01,0x12,0x33,0x28,0x00};
  const int N= sizeof(data)/sizeof(data[0]);
  cout<<"data= "<<echo_uschar(data,N)<<endl;
  return 0;
}

出力結果:

data=  01 12 33 28 00

main で

  cout<<"data= "<<echo_uschar(data,N,"-")<<endl;

とすれば,-で区切れる.

同じ変数型に対して異なる書式を持たせた operator<< を複数作りたい場合は,このメソッドがベストだと思います.




Last-modified:2014-12-31 (Wed) 03:03:37 (3835d)
Site admin: Akihiko Yamaguchi.
Written by: Akihiko Yamaguchi.
System: PukiWiki 1.5.0. PHP 5.2.17. HTML conversion time: 0.009 sec.