An elegant way of sequential comparison (C ++)

Suppose I have a class with several member variables:

class MyClass{ std::string a; int b; SomeOtherClass c; // some stuff... public: // some other stuff... }; 

I want to define relational operators ( operator< , etc.) that first compare a , but if a are equal, compare b , but if b are equal, compare c . (We assume SomeOtherClass already has relational operators.) So, I have something like

 bool operator==(MyClass param){ return (a == param.a) && (b == param.b) && (c == param.c); } bool operator<(MyClass param){ if(a < param.a) return true; if(a > param.a) return false; if(b < param.b) return true; if(b > param.b) return false; if(c < param.c) return true; return false; } 

etc. Is there a more elegant way to do this? This seems rather cumbersome, especially when comparing multiple member variables. (Boost is an option.)

+3
source share
3 answers

Yes, there are two ways that I have usually seen:

 bool operator<(MyClass param){ if(a != param.a) return a<param.a; if(b != param.b) return b<param.b; return c<param.c; } 

http://coliru.stacked-crooked.com/view?id=dd70799c005e6e99c70ebda552161292-c96156d6cc95286981b0e9deef2eefae

or

 bool operator<(MyClass param){ return std::tie(a, b, c)<std::tie(param.a, param.b, param.c); } 

http://coliru.stacked-crooked.com/view?id=00278eaca0d73b099fcd8edf87b5057b-c96156d6cc95286981b0e9deef2eefae

+7
source

Of course you can use std::tie for this:

 #include <tuple> bool operator<(const MyClass& lhs, const MyClass& rhs) { return std::tie(lhs.a, lhs.b, lhs.c) < std::tie(rhs.a, rhs.b, rhs.c); } 
+3
source

Of course you can use std::tie :

 #include <tuple> bool operator<(MyClass param){ return std::tie( a, b, c ) < std::tie( param.a, param.b, param.c ); } 

It will create a tuple , and after that you just use operator< .

This operator will compare each element of the tuple.

+3
source

Source: https://habr.com/ru/post/986755/


All Articles