Есть много способов сделать это.
Если вы случайно знаете, что второй аргумент z_distance
всегда будет фиксированным значением, вы можете преобразовать функцию в компараторнаписав вспомогательную функцию, которая фактически выполняет сравнение.Например:
bool CompareByDistance(const boost::filesystem::path& lhs,
const boost::filesystem::path& rhs) {
return z_distance(lhs, kSecondArg) < z_distance(rhs, kSecondArg);
}
Если вы не знаете, каким должен быть второй параметр функции z_distance
, или его можно определить только во время выполнения, тогда вам может потребоватьсяиспользовать функциональный объект .Функциональный объект (иногда называемый функтором ) - это объект, который имитирует обычную функцию.Вы можете вызвать его, передав некоторое количество параметров, но, поскольку это объект, функция, вызываемая в результате вызова, может получить доступ к локальному состоянию в дополнение к параметрам.Один такой функциональный объект, который вы можете создать, может выглядеть так:
class CompareByDistance {
public:
/* Constructor takes in the time that you want to sort at,
* then stores it for later.
*/
CompareByDistance(int time) : mTime(time) {
}
/* This is the function call operator that is called when you try
* treating a CompareByDistance object as a function. Note how it
* uses the mTime field as a parameter to `z_distance`.
*/
bool operator()(const boost::filesystem::path& lhs,
const boost::filesystem::path& rhs) const {
return z_distance(lhs, mTime) < z_distance(rhs, mTime);
}
private:
const int mTime; // Store mTime for later
};
Теперь, если вы хотите отсортировать все в какой-то момент времени t, вы можете написать
sort(elems.begin(), elems.end(), CompareByDistance(t));
Для получения дополнительной информации офункторы и, как бесстыдный плагин, вот глава о функторах , которую я написал для курса C ++, который я преподавал год назад.
Надеюсь, это поможет!