Lexicographic ordering
12345678910111213141516171819 | #include <tuple>
class foo
{
public:
foo(int n_, char c_, double d_)
: n{n_}, c{c_}, d{d_}
{}
friend bool operator<(const foo& lh, const foo& rh)
{
return std::tie(lh.n, lh.c, lh.d) <
std::tie(rh.n, rh.c, rh.d);
}
private:
int n;
char c;
double d;
}; |
This pattern is licensed under the CC0 Public Domain Dedication.
Intent
Implement a lexicographic ordering over class members.
Description
The class foo
, on lines 3–19, has three member variables n
, c
and
d
declared on lines 16–18. We wish to implement an ordering relation
for foo
where these members are compared lexicographically.
Getting an ordering relation right with 3 elements or more is
tedious and error-prone. Fortunately, the standard library
provides a lexicographic ordering over
std::tuple
, which we can utilise.
The less-than operator for foo
defined on lines 10–14 compares the
member n
first, then c
if the n
s are equal, and finally the
member d
if both the n
s and c
s are equal. To achieve this,
we use std::tie
on line 12 and line 13 to
create std::tuple
s containing references to the members of
the left operand and right operand respectively. The comparison
of these std::tuple
s provides a lexicographic ordering over
these members.