C++における演算子オーバーロード
C++ではオーバーロードの内容を関数ように記述することによって,演算子オーバーロードを実現します.
ここでは今回オーバーロードしたいシフト演算子を例にとります.
std::ostream& operator<< (std::ostream& os, std::pair<int, int> p) {
os << "[" << p.first << "," << p.second << "]";
return os;
}
イメージとしてはoperator<<
という関数を新しく作成したと考えてください.
返り値にstd::ostream&
,引数にos
とp
を持つ関数です.
std::ostream&
になじみがないかもしれませんが,std::cout
の型だと思ってもらえればオーケーです.
std::pair<int, int> sample_pair = std::make_pair(1, 2);
std::cout << sample_pair;
関数の呼び出しに演算子を使うのが通常の関数との違いです.
シフト演算子は二項演算子なので引数を二つ取ります.
今回の場合はos=std::cout
,p=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
などにも同じように使えるので是非!