Barton-Nackman trick

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