yohhoyの日記

技術的メモをしていきたい日記

tieを用いた比較演算子の実装

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