読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

operator!=のオーバーロードを省く

operator==オーバーロードされていたら、 operator!= の値は自明なので、定義を省きたい。

struct Num {
  Num(int x) : x(x) {}
  bool operator==(Num y) const { return x == y.x; }
  int x;
};

というクラスを定義したときに、Numクラスの比較結果は、

Num(0) == Num(0); // 1
Num(0) == Num(1); // 0
Num(0) != Num(0); // コンパイルエラー
Num(0) != Num(1); // コンパイルエラー

これを回避するにはグローバルな場所に T に対するoperator!= を定義する。

template <typename T>
bool operator!=(const T &x, const T &y) { return !(x == y); }

ただしグローバルな場所を汚染するので、バッドノウハウ過ぎて実用性は不明。 なお > <= >= も、operator<operator== より一意に決まる。