C++11標準ライブラリで追加されたタプルを利用し、ユーザ定義型の比較演算子を簡単に実装する方法。
#include <tuple> // ユーザ定義型 struct Person { std::string lname; // last name std::string fname; // family name int age; }; bool operator<(const Person& x, const Person& y) { // std::tie関数でタプル生成+std::tupleの比較演算子を利用 return std::tie(x.lname, x.fname, x.age) < std::tie(y.lname, y.fname, y.age); }
これを 20.4.2.7/p5 に従って展開すると下記の通り。STLが要求する “厳密な弱い順序(strict weak ordering)” を実装している。(25.4)
bool operator<(const Person& x, const Person& y) { return (x.lname < y.lname) || !(y.lname < x.lname) && ( (x.fname < y.fname) || !(y.fname < x.fname) && ( x.age < y.age )); }
関連URL