Как захватить переменную этого объекта в лямбду? - PullRequest
4 голосов
/ 23 мая 2019

Я видел много ответов на SO, спрашивающих о захвате this по ссылке, но у меня другой вопрос.Что, если я хочу захватить определенную переменную, принадлежащую объекту this?

Например:

auto rel_pose = [this->_last_pose["main_pose"],&pose](Eigen::VectorXd pose1, Eigen::VectorXd pose2)
    {
        // Some code
        return pose;
    };

Я хочу захватить определенную переменную this по значению и использовать еевнутри моего лямбда-выражения.Почему это невозможно?

Ответы [ 3 ]

5 голосов
/ 23 мая 2019

Вы можете применить захват при копировании с инициализатором (начиная с C ++ 14) (или захват по ссылке с помощью инициализатора, зависит от вашего требования), например,

auto rel_pose = [some_pose = this->_last_pose["main_pose"], &pose](Eigen::VectorXd pose1, Eigen::VectorXd pose2)
{
    // Some code using some_pose
    return pose;
};

Обратите внимание, что мы можем только захватывать идентификаторы в лямбда-выражении, мы не можем напрямую захватывать выражения типа this->_last_pose["main_pose"]. Захват с инициализатором просто решает такие проблемы.

5 голосов
/ 23 мая 2019

Возможно:

struct S
{
    int i = 7;
    char c = 0;
};

int main(int argc, char* argv[])
{
    S s;
    auto l = [integer = s.i]() {
        return integer;
    };

    return l();
}
0 голосов
/ 23 мая 2019

Почему это невозможно?

Это возможно, как показывают другие ответы.Но вы должны сделать это явно .Доступ к любому члену текущего объекта в лямбде автоматически преобразуется в доступ через указатель this.Когда вы пишете простое [this->_last_pose["main_pose"],&pose], на самом деле захватывается this, и через него проходит доступ к _last_pose.

Это просто то, как лямбда-захваты указываются для переменных-членов.Будьте благодарны, что вы компилируете C ++ 14.В C ++ 11 захват членов по значению был не так прост, как добавление захвата инициализации, который делает копию.

...