friend関数をクラススコープ内で定義する手法が
Barton-Nackmand trick(もしくはBarton and Nackman trick)と呼ばれている
以下がその例である
template <class T> class equal_comparable { // Tクラスの==演算子を使って!=演算子を定義 friend bool operator!=(const T& lhs, const T& rhs) { return !lhs.operator==(rhs); } }; class hoge : private equal_comparable<hoge> { int id_; public: explicit hoge(int id) : id_(id) {} bool operator==(const hoge& rhs) const { return id_ == rhs.id_; } }; int main() { hoge h1(1); hoge h2(1); bool is_equal = h1 == h2; bool is_not_equal = h1 != h2; return 0; }
この例では、equal_comparableを継承したクラスは、==演算子さえ定義すれば!=演算子が自動生成される
このテクニックはBoost.Operatorsでも使用されている
参考サイト
Wikipedia - Barton-Nackman trick