Я реализовал функциональность пространства имен 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);
}
};
T& Base() const { return static_cast<T&>(*this); }
. Если ты учишься, у тебя все хорошо. Если вы хотите определить операторы, вам следует взглянуть на Boost.Operators, как рекомендуется usta. - person Daniel Lidström   schedule 14.10.2010lhs<=rhs
в терминах!(rhs<lhs)
иlhs>rhs
в терминахrhs<lhs
. - person usta   schedule 14.10.2010