История изменений
Исправление Kuzy, (текущая версия) :
Эх, можно было бы в C++ делать анонимные объекты, не создавая класс - было бы не намного длиннее, чем на джаваскрипте или питоне.
Можно.
#include <iostream>
#include <functional>
#include <memory>
auto get_counter() {
auto i = std::make_shared<int>(0);
auto increment = [=]() {
return ++(*i);
};
auto reset = [=]() {
(*i) = 0;
};
struct Counter {
std::function<int()> increment;
std::function<void()> reset;
Counter(
std::function<int()> increment,
std::function<void()> reset
): increment(increment), reset(reset) {}
};
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;
}
UPD. Тут конструктор можно совсем выпилить и делать Counter {increment, reset}
.
Исправление Kuzy, :
Эх, можно было бы в C++ делать анонимные объекты, не создавая класс - было бы не намного длиннее, чем на джаваскрипте или питоне.
Можно.
#include <iostream>
#include <functional>
#include <memory>
auto get_counter() {
auto i = std::make_shared<int>(0);
auto increment = [=]() {
return ++(*i);
};
auto reset = [=]() {
(*i) = 0;
};
struct Counter {
std::function<int()> increment;
std::function<void()> reset;
Counter(
std::function<int()> increment,
std::function<void()> reset
): increment(increment), reset(reset) {}
};
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;
}
UPD. Тут конструктор можно совсем выпилить, и делать Counter {increment, reset}
.
Исходная версия Kuzy, :
Эх, можно было бы в C++ делать анонимные объекты, не создавая класс - было бы не намного длиннее, чем на джаваскрипте или питоне.
Можно.
#include <iostream>
#include <functional>
#include <memory>
auto get_counter() {
auto i = std::make_shared<int>(0);
auto increment = [=]() {
return ++(*i);
};
auto reset = [=]() {
(*i) = 0;
};
struct Counter {
std::function<int()> increment;
std::function<void()> reset;
Counter(
std::function<int()> increment,
std::function<void()> reset
): increment(increment), reset(reset) {}
};
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;
}