LINUX.ORG.RU

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

Исправление 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;
}