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