Создание лямбда-выражения в классе с использованием членов - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь создать функцию-член класса, которая возвращает лямбда-выражение, основанное на членах класса. Для упрощения я создал этот пример кода.

#include <functional>

class A
{
private:
    int value;

public:
    // Default constructor
    A()
    : value(0)
    { };

    // Constructor
    A(int value)
    : value(value)
    { };

    // Returns a lambda expression
    std::function<int()> get_value()
    {
        return [](){ return value; };
        // Gives error: "error: 'this' was not captured for this lambda function"
    }
};

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

Вопрос: как использовать переменные-члены класса в лямбда-выражениях членов класса? Другими словами: как мне захватить «это» в лямбда-функции в классе?

1 Ответ

2 голосов
/ 12 февраля 2020

Если вы хотите захватить this, то вам следует захватить this:

return [this](){ return value; };

Однако это сопровождается обычным предупреждением о том, что this, захваченный лямбдой, может использоваться только как пока this жив.

PS

Я знаю, что для этой реализации ее можно запрограммировать намного проще (оставьте лямбда-выражение в стороне), [ ...]

Если вы хотите, чтобы вызываемый элемент возвращал вам value из A, тогда я бы не знал, как это сделать (легко) без использования лямбда-выражения , Я скорее вижу проблему в вашем дизайне. Как упомянуто выше, вызывающая сторона должна быть осторожна, чтобы использовать возвращенный std::function, пока объект A жив. Существует неочевидная зависимость с тем, что ваш A может быть легко использован неверно:

auto f = A{}.get_value();

Это создает сломанный std::function<int()>. Честно говоря, ваш код - это то, что я бы назвал «инкапсуляция прошла ужасно неправильно». Конечно, ваш код является лишь примером, но рассмотрим этот пример:

struct A { int value = 0; };

int main() {
    A a;
    auto f = [&](){ return a.value; };
}        

Здесь вызывающая сторона (ie пользователь A) имеет зависимость (удобство использования f зависит от времени жизни a) явно в их коде.

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