Il compilatore non farà nulla per sé per voi qui, ma è relativamente semplice per generare automaticamente ereditando dalla una classe adeguata, qualcosa di simile:
template< typename DerivedType >
class ComparisonOperators
{
public:
friend bool operator!=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(lhs == rhs);
}
friend bool operator<=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(rhs < lhs);
}
friend bool operator>(
DerivedType const& lhs,
DerivedType const& rhs)
{
return rhs < lhs;
}
friend bool operator>=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(lhs < rhs);
}
protected:
~ComparisonOperators() {}
} ;
Definire <
e ==
nella tua classe, e derivano da questo, e avrai tutti gli operatori:
class MyClass : public ComparisonOperators<MyClass>
{
// ...
public:
bool operator==(MyClass const& other) const;
bool operator<(MyClass const& other) const;
// ...
};
Solo una nota: ho semplificato manualmente la versione che ho Actu Al uso, che definisce ==
e <
pure, cerca il membro funzioni compare
e isEqual
, e usa compare
per ==
e !=
quando non c'è isEqual
. Non credo di aver introdotto errori , ma non si sa mai.
fonte
2013-07-23 18:12:00
Se avere 'operator <' e 'operator ==' definito, è possibile trascinare nello spazio nomi ['std :: rel_ops'] (http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp) per fornire il resto degli operatori, ma questa non è davvero una [buona soluzione] (http://stackoverflow.com/questions/62 25375/idiomatica-uso-di-stdrel-ops). [Boost.Operators] (http://stackoverflow.com/a/14756785/241631) è il modo giusto per farlo. – Praetorian
Qualcosa non mi piace proprio usando l'ereditarietà per risparmiare la digitazione di alcuni operatori. Preferirei aggiungerli manualmente. =) –
derivante da una classe che fornisce la funzionalità ha anche un grande valore di documentazione. È una forma primitiva di concetti. – TemplateRex