Что означает данное выражение?

114
27 сентября 2021, 11:00

Помогите пожалуйста понять данный код.

//class
class EPS
{
  EPS() : a(0) {}
  explicit EPS(int l_val) : a(l_val) {}
  int getVal() { return a }
  bool drop(const EPS&l_eps, int l_point);
  int a;
};
//global
std::vector<EPS> tet;
//some func
bool func(const EPS &l_eps)
{
  return std::find_if(tet.begin(), tet.end(),
  [&l_eps](EPS& eps)
  { 
    return eps.drop(l_eps, eps.getVal());
  }) != tet.end();
}

Собственно что происходит в функции func? Что значит [&l_eps](EPS &eps)? По другому нельзя это написать?

Добавлено: Как перегрузить оператор функции отбросив использование лямбда функции? Вот так правильно? //class ESP

   bool operator()(ESP &eps)const
        {
            return eps.drop(*this ,eps.getVal());
        }
Answer 1

Это - лямбда-выражение. Т.е. функциональный объект, который служит предикатом при поиске find_if.

[&l_eps](EPS& eps)
{ 
    return eps.drop(l_eps, eps.getVal());
}

Это такая упрощенная форма записи для создания анонимного класса, в объекте которого хранится ссылка на l_eps и который в операторе operator()(EPS&) выполняет вот тот самый drop.

Конечно, это можно записать явно как функциональный объект или как функцию, работающую с глобальной переменной, но так - проще, красивее и понятнее (и не надо далеко бегать посмотреть, кто за предикат использован в find_if).

Примерно (не компилировал) так:

class Func
{
public:
    Func(EPS& l_eps):l_eps(l_eps){}
    bool operator()(EPS&eps)
    {
        return eps.drop(l_eps, eps.getVal());
    }
private:
    EPS& l_eps;
};
...
return std::find_if(tet.begin(), tet.end(), Func(l_eps));

Кстати, я бы рекомендовал не избегать const при объявлении de facto константных вещей...

Answer 2
  1. [](){} это объявление лямбда-функции
  2. [&l_eps] - захват переменной l_eps по ссылке
  3. (EPS &eps) - параметр функции ну и так далее

В func ищется в векторе tet нечто, что возвращает true об eps.drop(l_eps, eps.getVal());

Переписать то, конечно, можно. Только вот, кмк, сейчас вполне ок написано.

READ ALSO
перекомпилируйте с параметром -fPIC

перекомпилируйте с параметром -fPIC

Работаю над проектом(состоящий из нескольких подпроектов) Cmake с использование библиотеки wxWidgets, некоторые проекты не могут собраться по причине:

77
При комплиляции программа выдает a=0.00000,b=-9334555

При комплиляции программа выдает a=0.00000,b=-9334555

уважаемые форумчанеПишу программу по заданию(Даны 2 числа

139
Как рисовать на представлении? Qt

Как рисовать на представлении? Qt

Есть модель, содержащая строки, и списочное представление

83