C++ std::rel_ops功能作为基类。这是合适的解决方案吗?

C++ std::rel_ops功能作为基类。这是合适的解决方案吗?,c++,templates,comparison-operators,C++,Templates,Comparison Operators,我已经将std::rel_ops namespace的功能实现为模板基类(它仅使用运算符

我已经将std::rel_ops namespace的功能实现为模板基类(它仅使用运算符<和==)定义所有比较运算符)。对我来说,它能正常工作(到目前为止)有点奇怪,而且我担心使用的“黑客”。有人能评估一下下面的代码,并说我是幸运的,它可以工作,还是做这样的事情是标准的做法

template <typename T>
class RelationalOps {
public:

    inline bool operator!=(const T &rhs) const
    {
        const T& lhs = static_cast<const T&>(*this);
        return !(lhs == rhs);
    }

    inline bool operator<=(const T &rhs) const
    {
        const T& lhs = static_cast<const T&>(*this);
        return ((lhs < rhs) || (lhs == rhs));
    }

    inline bool operator>(const T &rhs) const
    {
        const T& lhs = static_cast<const T&>(*this);
        return !((lhs < rhs) || (lhs == rhs));
    }

    inline bool operator>=(const T &rhs) const
    {
        const T& lhs = static_cast<const T&>(*this);
        return !(lhs < rhs);
    }
};
模板
类关系运算{
公众:
内联布尔运算符!=(常数T和rhs)常数
{
常数T&lhs=静态施法(*此);
返回!(lhs==rhs);
}
内联布尔运算符(常数T和rhs)常数
{
常数T&lhs=静态施法(*此);
返回!((lhs=(常数T和rhs)常数
{
常数T&lhs=静态施法(*此);
返回!(左侧<右侧);
}
};

<>代码>为什么不使用?

你使用的是C++习惯用法,称为奇怪的重复模板模式(CRTP)。这是一个强有力的方法,我自己也用过很多次。对T的引用有时是通过一个特殊的方法完成的:
T&Base()const{return static_cast(*this)}
。如果你在学习,你做得很好。如果你想定义操作符,你应该看看Boost.operators,就像usta推荐的那样。如果你需要手工定义操作符,我可能还应该建议更好的方法:define
lh所有这些函数上的“inline”规范都是多余的,因为在类体中定义的函数都是隐式内联的。