Реализуйте функцию шаблона, которая выполняет итерацию по коллекции - PullRequest
0 голосов
/ 12 июля 2020

Как мне реализовать эту функцию-шаблон, которая в будущем выбирает быстрые автомобили путем итерации по предоставленной коллекции?

void select(T test, std::list<const Vehicle*>& vehicles) : функция template , которая выполняет итерацию по автомобилям, хранящимся в m_vehicles, и добавляет ко второму параметру все автомобили, для которых test истинно. Первый параметр (test) может быть лямбда-выражением, указателем на функцию или функтором, соответствующим прототипу: bool func(const sdds::Vehicle*);

Это одно из лямбда-выражений, которое будет вызываться для выбора только быстрых транспортных средств

auto fastVehicles = [&](const sdds::Vehicle* veh_fast){
            bool value = false;
            
            if (veh_fast->topSpeed() > 300){
                value = true;
            }
            
            return value;
};

Моя функция не работает, однако это класс и то, что я пробовал до сих пор:

class Autoshop {
    
    std::vector<Vehicle*> m_vehicles;
    
public:
   
    Autoshop();
    ~Autoshop();
    Autoshop& operator +=(Vehicle* theVehicle);
    void display(std::ostream& out) const;
    
   template<typename T>
    void select(T test, std::list<const Vehicle*>& vehicles){
        bool c = true;
        if (test == c) {
             for (auto it = m_vehicles.begin(); it != m_vehicles.end(); ++it) {
  vehicles.push_back(*it);
                
             }
        }
    }
};

Ошибки:

ошибка: нет совпадения для вызова '(main (int, char **) :: ) () '46 | if (test () == c) {| ~~~~ ^ ~ w6_p2. cpp: 80: 29: примечание: кандидат: 'main (int, char **) :: '80 | auto fastVehicles = [&] (const sdds :: Автомобиль * veh_fast) {| ^ w6_p2. cpp: 80: 29: примечание: кандидат ожидает 1 аргумент, при условии 0

1 Ответ

1 голос
/ 12 июля 2020

Вы должны протестировать автомобиль, поэтому вы должны передать его в тестовую функцию.

Таким образом, вызов test должен быть внутри вашего l oop, а не снаружи, и вы проходите разыменованный итератор к нему. Т.е.

for (auto it = m_vehicles.begin(); it != m_vehicles.end(); ++it)
    if (test(*it)) // perform the test on a vehicle
        vehicles.push_back(*it);

Диапазон на основе l oop может быть немного проще для понимания

for (auto vp : m_vehicles)
    if (test(vp)) // perform the test on a vehicle
        vehicles.push_back(vp);

Или используйте std::copy_if, как предложено в комментариях выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...