C++でクラスに演算子==
をオーバーロード定義してあげても、a != b
という比較はできません。演算子!=
を別途定義する必要があります。
でもほとんどの場合、!=
の働きは==
の否定でしょう。それなら共通ヘッダにこんなテンプレートを置いておけば
template<class T, class F = decltype(!(std::declval<T>()==std::declval<T>()))>
// 自動的に定義される!=演算子。==演算子の結果に!演算子を適用した結果を返します。
F operator!=(T a, T b)
{
return !(a==b);
}
==
演算子が定義されていて!=
が未定義のすべての型について、!=
演算子が自動定義されます。戻り値がbool
であるとは限りません。==
と!
の定義次第です。
==
演算子の定義はこのテンプレートより前でも後ろでも構いません。
また、自力定義の!=
演算子があれば、このテンプレートより前にあっても後ろにあってもそちらが有効なままとなります。