5

何が望ましいですか(もしあれば)?

バリアント A (バートン ナックマン):

template<class T>
struct equal_comparable {
    friend bool operator == (const T & t1, const T & t2) {
        return t1.equalTo (t2);
    }
};

class MyClass : private equal_comparable<MyClass> {
    bool equalTo (const MyClass & other)  //...
};

バリアント B (std::enable_if):

struct MyClass {
    static const bool use_my_equal = true;
    bool equalTo (const MyClass & other) //...
};

template<class T>
typename std::enable_if<
    T::use_my_equal,
    bool
>::type
operator == (const T & t1, const T & t2) { return t1.equalTo (t2); }
4

1 に答える 1

4

コメントで @SteveJessop が言及したBoost.Operatorsを使用することをお勧めします。これにより、最初のアプローチが形式化および自動化されます。複数の演算子のセットが必要な場合 (したがって、複数の継承が必要になる場合) は、空のベースの最適化も処理します。これらの基本クラスはクラス インターフェイスのすぐ前にあるため、タイピングの節約になるだけでなく、コードのドキュメント化/適用の価値も高まります。そういう意味では原始的なコンセプトです。

于 2013-01-10T22:48:42.823 に答える