2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シフト演算子をオーバーロードして快適なデバッグ生活を送る

Last updated at Posted at 2019-08-07

C++における演算子オーバーロード

C++ではオーバーロードの内容を関数ように記述することによって,演算子オーバーロードを実現します.
ここでは今回オーバーロードしたいシフト演算子を例にとります.

演算子オーバーロードの例
std::ostream& operator<< (std::ostream& os, std::pair<int, int> p) {
	os << "[" << p.first << "," << p.second << "]";
	return os;
}

イメージとしてはoperator<< という関数を新しく作成したと考えてください.
返り値にstd::ostream&,引数にospを持つ関数です.
std::ostream&になじみがないかもしれませんが,std::coutの型だと思ってもらえればオーケーです.

オーバーロードした演算子の呼び出し
std::pair<int, int> sample_pair = std::make_pair(1, 2);
std::cout << sample_pair;

関数の呼び出しに演算子を使うのが通常の関数との違いです.
シフト演算子は二項演算子なので引数を二つ取ります.
今回の場合はos=std::coutp=sample_pairとして operator<<という関数が呼び出されたと考えることが出来ます.

#演算子オーバーロードでデバッグ
ここまでを読んで勘の良い方はお気づきかもしれませんが,デバッグ出力をしたい変数の演算子オーバーロードを記述しておけばとても簡単にデバッグが可能です.
例えば配列の要素を見たければ

template<typename T>
std::ostream& operator<< (std::ostream& os, std::vector<T>& v) {
	os << "[ ";
	for (T& x : v)os << x << " ";
	os << "]";
	return os;
}

といった具合です.

演算子オーバーロードのスコープ

演算子オーバーロードも通常の関数と同じようなスコープを持ちます.
そのためクラスのメンバ関数とする,適切な名前空間に配置するなどして意図しない呼び出しを防ぐ工夫が大切です.
#まとめ
普段std::coutを使うのと同じ感覚でデバッグ出力が出来る演算子オーバーロードについて紹介しました.
std::cerrなどにも同じように使えるので是非!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?