Je suis en train de concevoir plusieurs classes qui doivent prendre en charge les opérateurs !=
, >
, <=
et >=
. Ces opérateurs seront implémentés en termes d'opérateurs ==
et <
. À ce stade, je dois faire un choix entre l'héritage¹ et forcer mes consommateurs à utiliser std::rel_ops
² "manuellement".Dilemme d'implémentation de l'opérateur relationnel
[1] L'héritage (de mise en œuvre possible):
template<class T> class RelationalOperatorsImpl
{
protected:
RelationalOperatorsImpl() {}
~RelationalOperatorsImpl() {}
friend bool operator!=(const T& lhs, const T& rhs) {return !(lhs == rhs);}
friend bool operator>(const T& lhs, const T& rhs) {return (rhs < lhs);}
friend bool operator<=(const T& lhs, const T& rhs) {return !(rhs < lhs);}
friend bool operator>=(const T& lhs, const T& rhs) {return !(lhs < rhs);}
};
template<typename T> class Foo : RelationalOperatorsImpl< Foo<T> >
{
public:
explicit Foo(const T& value) : m_Value(value) {}
friend bool operator==(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value == rhs.m_Value);}
friend bool operator<(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value < rhs.m_Value);}
private:
T m_Value;
};
[2] std::rel_ops
colle:
template<typename T> class Foo
{
public:
explicit Foo(const T& value) : m_Value(value) {}
friend bool operator==(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value == rhs.m_Value);}
friend bool operator<(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value < rhs.m_Value);}
private:
T m_Value;
};
void Consumer()
{
using namespace std::rel_ops;
//Operators !=, >, >=, and <= will be instantiated for Foo<T> (in this case) on demand.
}
Je suis fondamentalement en essayant d'éviter la répétition de code. Des pensées quant à la méthode qui "sent" le mieux?
C'est une excellente suggestion. Boost ne cesse jamais de me surprendre. J'aimerais entendre les commentaires des autres avant d'accepter une réponse, cependant. ;) –