Помогите пожалуйста понять данный код.
//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());
}
Это - лямбда-выражение. Т.е. функциональный объект, который служит предикатом при поиске 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 константных вещей...
[](){}
это объявление лямбда-функции[&l_eps]
- захват переменной l_eps по ссылке(EPS &eps)
- параметр функции ну и так далееВ func ищется в векторе tet нечто, что возвращает true об eps.drop(l_eps, eps.getVal());
Переписать то, конечно, можно. Только вот, кмк, сейчас вполне ок написано.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В библиотеке есть функции:
Работаю над проектом(состоящий из нескольких подпроектов) Cmake с использование библиотеки wxWidgets, некоторые проекты не могут собраться по причине:
уважаемые форумчанеПишу программу по заданию(Даны 2 числа