Barton-Nackman vs std :: enable_if

时间:2012-12-04 14:27:44

标签: c++ operator-overloading template-meta-programming c++-concepts

什么是可取的(如果有的话)?

变种A(Barton-Nackman):

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); }

1 个答案:

答案 0 :(得分:4)

我更倾向于在评论中使用@SteveJessop提到的Boost.Operators,这会使您的第一种方法正式化并自动化。如果您碰巧需要多组运算符(因此需要多重继承),它们还会处理空基优化。这不仅仅是节省打字,而且还有代码文档/执行值,因为这些基类就在类接口的前面。从这个意义上讲,它是概念的原始方式。