C ++ выберите свойство для сортировки - PullRequest
0 голосов
/ 03 октября 2018

Предположим, у меня есть класс Car с тремя свойствами, каждый из которых имеет тип int type: year, modelNo и topSpeed.

У меня есть список Cars и функция, которая сортирует этот список.Этот метод в настоящее время сортирует автомобили по car.modelNo.

Если я захочу отсортировать по году, modelNo или topSpeed, я мог бы сделать три разных метода: sortByYear, sortByModelNo и т. Д.

Есть ли способ, которым яможет реализовать один метод сортировки, и вместо этого просто передать ему имя свойства, по которому я хочу отсортировать?Поэтому я могу назвать sortCars(carsList, modelNo); или sortCars(carsList, year);

Каждое из этих свойств всегда будет int, а список будет содержать только объекты Car.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Стандартный подход библиотеки - передать функтор, который реализует желаемое сравнение.См. std::sort.

В этом случае ваша функция sortCars будет выглядеть примерно так:

template <typename Comp>
void sortCars(std::vector<Car>& cars, Comp comp)
{
    // compare cars with comp(car1, car2)
}

Тогда вы бы назвали это так:

sortCars(carsList, [](const Car& a, const Car& b) { return a.year < b.year; });
0 голосов
/ 03 октября 2018

Да, используя указатели на участников.

void sortCars(std::vector<Car> &cars, int Cars::*property) {
    std::sort(begin(cars), end(cars), [=](Car const &a, Car const &b){
         return (a.*property) < (b.*property);
    });
}

Синтаксис вызова:

sortCars(myCars, &Cars::modelNo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...