Мне трудно понять, как работает захват лямбда, в частности, как он перехватывает аргументы внутри лямбда. Я провел несколько часов, читая одни и те же тривиальные примеры о лямбдах, и до сих пор не понял.
Вот контекст. У меня есть узел класса:
class EventComparisonNode : public Node{ //or Date comparison node, only difference is instead of event there is Date struct
public:
EventComparisonNode(Comparison cmp, const std::string& event);
bool Evaluate(const Date& date, const std::string& event) override; //Date struct contains ints
private:
Comparison cmp_; //it's enum
std::string event_;
};
И у меня есть этот кусок кода
//ParseCondition returns shared_ptr<Node>
auto condition = ParseCondition(is);
auto predicate = [condition](const Date& date, const string& event) {
return condition->Evaluate(date, event);
};
Вот мои вопросы:
Что такое предикат? Это какой-то пользовательский тип лямбда или что?
Во второй строке я фиксирую shared_ptr. Ok. Но откуда берутся даты, строки и типы? Я не вижу там ни структуры, ни переменной, ни чего-то еще, откуда это можно взять (и то, и другое одновременно). Переменные никуда не берутся.
Кстати, полный код доступен здесь: (не мой представитель)
https://github.com/freeraisor/yandexcplusplus/blob/master/2.%20Yellow/Final%20Project/main.cpp
Спасибо за Ваше внимание!
operator()
(чтобы экземпляры класса могли вызываться, как если бы они были функцией). Аргументы дляoperator()
такие же, как аргументы для вашей лямбды (const Date& date, const string& event
) - person AndyG   schedule 03.02.2021auto predicate = [condition](const Date& date, const string& event) { return condition->Evaluate(date, event); };
примерно эквивалентноstruct lambda_XYZ { shared_ptr<Node> condition; bool operator()(const Date& date, const string& event) const { return condition->Evaluate(date, event); }; lambda_XYZ predicate{condition};
- person Remy Lebeau   schedule 03.02.2021