Функциональность std::rel_ops в качестве базового класса. Это подходящее решение?

Я реализовал функциональность пространства имен std::rel_ops как базового класса шаблона (он определяет все операторы сравнения, используя только операторы ‹ и ==). Для меня немного странно, что он работает (пока) правильно, также меня беспокоят используемые «хаки». Может ли кто-нибудь оценить следующий код и сказать, повезло ли мне, что он работает, или это стандартная практика, чтобы делать такие вещи.

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

person Community    schedule 14.10.2010    source источник
comment
Вы используете идиому C++, называемую Curiously Recurring Template Pattern (CRTP). Это мощный метод, который я использовал много раз сам. Ссылка на T иногда делается специальным методом: T& Base() const { return static_cast<T&>(*this); }. Если ты учишься, у тебя все хорошо. Если вы хотите определить операторы, вам следует взглянуть на Boost.Operators, как рекомендуется usta.   -  person Daniel Lidström    schedule 14.10.2010
comment
Я, вероятно, должен также предложить лучшие способы определения таких операторов, если вам когда-нибудь понадобится сделать это вручную: определить lhs<=rhs в терминах !(rhs<lhs) и lhs>rhs в терминах rhs<lhs.   -  person usta    schedule 14.10.2010
comment
«Встроенная» спецификация для всех этих функций является избыточной, поскольку функции, определенные в теле класса, являются неявно встроенными.   -  person Mankarse    schedule 03.06.2011


Ответы (1)


Почему бы не использовать Boost.Operators?

person usta    schedule 14.10.2010