Вы можете передать указатель функции, объект функции (или увеличить lambda) в std:: sort, чтобы определить строгий слабый порядок элементов контейнера, который вы хотите отсортировать.
Однако иногда (достаточно, чтобы я ударил это несколько раз), вы хотите иметь возможность связывать "примитивные" сравнения.
Тривиальный пример: если вы сортируете коллекцию объектов, представляющих контактные данные. Иногда вам нужно сортировать по
last name, first name, area code. Другие времена
first name, last name- еще раз
age, first name, area code... и т.д.
Теперь вы можете, конечно, записать дополнительный объект функции для каждого случая, но это нарушает принцип DRY - особенно если каждое сравнение менее тривиально.
Похоже, что вы должны иметь возможность писать иерархию функций сравнения - низкоуровневые выполняют одиночные, примитивные, сопоставления (например, имя и имя), а затем более высокие уровни называет нижние уровни подряд (возможно, цепочки с использованием && использовать для оценки короткого замыкания) для создания составных функций.
Проблема с этим подходом заключается в том, что std:: sort принимает двоичный предикат - предикат может возвращать только bool. Поэтому, если вы их составляете, вы не можете сказать, означает ли "ложь" равенство или больше. Вы можете сделать предикаты нижнего уровня возвратом int с тремя состояниями - но тогда вам придется обернуть их в предикаты более высокого уровня, прежде чем их можно будет использовать с помощью std:: sort самостоятельно.
В целом, это не непреодолимые проблемы. Это просто кажется сложнее, чем должно быть - и, конечно же, приглашает реализацию вспомогательной библиотеки.
Поэтому кто-нибудь знает какую-либо ранее существовавшую библиотеку (например, если она является std или boost library), которая может помочь здесь - иметь какие-либо другие мысли по этому вопросу?
[Обновление]
Как упоминалось в некоторых комментариях - я пошел вперед и написал собственную реализацию класса для управления этим. Он довольно минимален и, вероятно, имеет некоторые проблемы с ним в целом. но на этой основе для всех, кого это интересует, класс находится здесь:
И некоторые вспомогательные функции (чтобы избежать необходимости указывать шаблонные аргументы) здесь: