関数ポインター、関数オブジェクト (またはブースト ラムダ) を std::sort に渡して、並べ替えたいコンテナーの要素の厳密な弱い順序付けを定義できます。
ただし、場合によっては (これを何度か実行したことがあります)、「プリミティブな」比較を連鎖させたい場合があります。
些細な例として、連絡先データを表すオブジェクトのコレクションを並べ替える場合があります。場合によっては、次のように並べ替えたいことがあります。
姓、名、市外局番. 別の時に
名前苗字- また別の時
年齢、名前、市外局番...など
これで、ケースごとに追加の関数オブジェクトを作成できますが、これは DRY の原則に違反します。特に各比較がさほど重要でない場合はなおさらです。
比較関数の階層を記述できるはずです-低レベルのものは単一のプリミティブな比較(たとえば、名<名)を実行し、次に高レベルのものは低レベルのものを連続して呼び出します(おそらく&& (短絡評価を利用する) を使用して複合関数を生成します。
このアプローチの問題点は、std::sort がバイナリ述語を取ることです。述語は bool のみを返すことができます。したがって、それらを構成している場合、「false」が等しいかより大きいかを示すことはできません。低レベルの述語が 3 つの状態を持つ int を返すようにすることができますが、それらを std::sort で単独で使用するには、高レベルの述語でそれらをラップする必要があります。
全体として、これらは克服できない問題ではありません。必要以上に難しいように思えます-そして確かにヘルパーライブラリの実装が必要です.
したがって、ここで役立つ既存のライブラリ (特に std または boost ライブラリの場合) を知っている人はいますか?
[アップデート]
いくつかのコメントで述べたように、私は先に進み、これを管理するクラスの独自の実装を作成しました。それはかなり最小限であり、おそらく一般的にいくつかの問題があります。しかし、それに基づいて、興味のある人のために、クラスはここにあります:
また、いくつかのヘルパー関数 (テンプレート引数を指定する必要を避けるため) は次のとおりです。