История изменений
Исправление 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.