Предположим, я хочу получить std::sort для сортировки вектора указателей на int на основе значения int, на которое указывают указатели. Игнорируйте очевидную проблему с производительностью. Просто да? Сделайте функцию:
bool sort_helper(const int *a, const int *b)
{
return *a < *b;
}
и передать в std::sort.
Теперь, если мы также хотим сделать то же самое с вектором указателей на большие объекты. Применяется то же самое: сначала мы определяем оператор <
в объекте, затем создаем функцию следующего содержания:
bool sort_helper(const ob_type *a, const ob_type *b)
{
return *a < *b;
}
или что-то еще, поставьте это в std:: sort.
Теперь, и здесь все становится сложнее: что, если мы хотим отсортировать вектор указателей на любой тип с любой произвольной функцией сравнения (мы делаем предположение, что какой бы тип мы ни использовали эту функцию, сможет работать с ним ) — предоставить шаблонную версию функции sort_helper выше очень просто:
template <class ob_type>
bool sort_helper(const ob_type *a, const ob_type *b)
{
return *a < *b;
}
Однако предоставить произвольную функцию сравнения сложнее: что-то вроде этого:
template <typename comparison_function, class ob_type>
bool sort_template_helper(const ob_type *a, const ob_type *b)
{
return comparison_function(*a, *b);
}
template <typename comparison_function, class iterator_type>
void t_sort(const iterator_type &begin, const iterator_type &end, comparison_function compare)
{
std::sort(begin, end, sort_template_helper<compare>);
}
это то, что я хотел бы сделать, но делаю это:
bool less_than(const int a, const int b)
{
return a < b;
}
void do_stuff()
{
t_sort(ipoint_vector.begin(), ipoint_vector.end(), sort_template_helper<less_than>);
}
Не работает. Как я могу отсортировать вектор указателей на известный тип по значению объектов, на которые он указывает, используя произвольную функцию сравнения, предоставленную std::sort? Предположим, что тестовый пример, который я здесь представляю, является безумно упрощенной версией фактического сценария, и что есть веские причины для того, чтобы делать что-то таким образом, что заняло бы слишком много времени, чтобы углубиться и отвлечься от проблемы.
[РЕДАКТИРОВАТЬ: по разным причинам я ищу решение, которое также работает на С++ 03 - спасибо Ниру за его ответ на С++ 14]