LINUX.ORG.RU

История изменений

Исправление hlebushek, (текущая версия) :

Да, ты прав. Придется делать шаред поинтер и захватывать его копии. Эх, можно было бы в C++ делать анонимные объекты, не создавая класс - было бы не намного длиннее, чем на джаваскрипте или питоне.

#include <iostream>
#include <functional>

struct Counter {
    std::function<int()> increment;
    std::function<void()> reset;

    Counter(
        std::function<int()> increment,
        std::function<void()> reset
    ): increment(increment), reset(reset) {}
};

auto get_counter() {
    auto i = std::make_shared<int>(0);
    auto increment = [=]() {
        return ++(*i);
    };
    auto reset = [=]() {
        (*i) = 0;
    };

    return Counter(increment, reset);
}

int main() {
    auto counter = get_counter();
    for (auto i = 0; i < 6; ++i) {
        std::cout << counter.increment() << ", ";
    }
    std::cout << std::endl;
    counter.reset();
    std::cout << counter.increment() << std::endl;
} 
// выводится
// 1, 2, 3, 4, 5, 6, 
// 1

Пожалуй, успех. Можно сделать скрытую приватную переменную, не используя слово private.

Исходная версия hlebushek, :

Да, ты прав. Придется делать шаред поинтер и захватывать его копии. Эх, можно было бы в C++ делать анонимные объекты, не создавая класс - было бы не намного длиннее, чем на джаваскрипте или питоне.

#include <iostream>
#include <functional>

struct Counter {
    std::function<int()> increment;
    std::function<void()> reset;

    Counter(
        std::function<int()> increment,
        std::function<void()> reset
    ): increment(increment), reset(reset) {}
};

auto get_counter() {
    auto i = std::make_shared<int>(0);
    auto increment = [=]() {
        return ++(*i);
    };
    auto reset = [=]() {
        (*i) = 0;
    };

    return Counter(increment, reset);
}

int main() {
    auto counter = get_counter();
    for (auto i = 0; i < 6; ++i) {
        std::cout << counter.increment() << ", ";
    }
    std::cout << std::endl;
    counter.reset();
    std::cout << counter.increment() << std::endl;
} 
// выводится
// 1, 2, 3, 4, 5, 6, 
// 1

Пожалуй, успех. Можно сделать скрытую приватную переменную, не используя слово private.