備忘録

プログラムやゲーム関連に関すること

【C++】クロージャ

Luaクロージャを扱ったのでC++でも実装する
クロージャに関することはLuaの記事を参照
参照:【Lua】クロージャ - 備忘録

test.cpp

#include <iostream>
#include <memory>
#include <functional>

int main(int argc, char *argv[])
{
	// 右辺の戻り値を型推論で省略すると
	// Visual C++ 2013 ではコンパイルエラーとなった
	auto Counter = []()->std::function<void()>
	{
		auto x = std::make_shared<int>(0);
		return [x](){ std::cout << (*x)++ << std::endl; };
	};

	auto func0 = Counter();
	auto func1 = Counter();

	func0(); // 0
	func1(); // 0
	func0(); // 1
	func1(); // 1
	func0(); // 2
	func1(); // 2

	getchar();

	return 0;
}