Вы можете передать указатель на функцию, функциональный объект (или увеличить лямбду) в std :: sort для определения строгого слабого порядка элементов контейнера, который вы хотите отсортировать.
Однако иногда (достаточно того, что я ударил это несколько раз), вы хотите иметь возможность «примитивных» сравнений.
Тривиальным примером будет, если вы сортируете коллекцию объектов, которые представляют контактные данные. Иногда вам захочется отсортировать по
last name, first name, area code
. В другое время
first name, last name
- но в другое время
age, first name, area code
... и т. Д.
Теперь вы, конечно, можете написать дополнительный функциональный объект для каждого случая, но это нарушает принцип СУХОГО - особенно если каждое сравнение менее тривиально.
Кажется, что вы должны быть в состоянии написать иерархию функций сравнения - низкоуровневые выполняют одиночные, примитивные сравнения (например, имя <имя), затем высокоуровневые последовательно вызывают низкоуровневые ( возможно, с использованием && для использования оценки короткого замыкания) для генерации составных функций. </p>
Проблема этого подхода заключается в том, что std :: sort принимает двоичный предикат - предикат может возвращать только bool. Поэтому, если вы их сочиняете, вы не можете сказать, означает ли «ложь» равенство или больше, чем. Вы можете сделать так, чтобы ваши предикаты более низкого уровня возвращали int с тремя состояниями - но тогда вам нужно было бы обернуть их в предикаты более высокого уровня, прежде чем их можно было бы использовать с std :: sort самостоятельно.
В общем, это не непреодолимые проблемы. Это кажется сложнее, чем должно быть - и, безусловно, предлагает реализацию вспомогательной библиотеки.
Следовательно, кто-нибудь знает о какой-либо уже существующей библиотеке (особенно если это библиотека std или boost), которая может здесь помочь, или есть какие-либо другие мысли по этому поводу?
[Update]
Как уже упоминалось в некоторых комментариях, я решил написать собственную реализацию класса для управления этим. Это довольно минимально, и, вероятно, имеет некоторые проблемы с ним в целом. но на этом основании, для всех, кто заинтересован, класс здесь:
http://pastebin.com/f52a85e4f
И некоторые вспомогательные функции (чтобы избежать необходимости указывать аргументы шаблона) здесь:
http://pastebin.com/fa03d66e