備忘録

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

【C++】関数オブジェクトのラッパー

std::function と std::bind について

#include <iostream>
#include <functional>

// オブジェクトクラス
class Object
{
public:
	void print(int x) const { std::cout << x << std::endl; }
};


// グローバル空間に配置した関数
void print_gloval(int x) { std::cout << x << std::endl; }

int _tmain(int argc, _TCHAR* argv[])
{
	// ローカル空間に配置したラムダ式関数
	auto print_lambda = [](int x){ std::cout << x << std::endl; };

	// グローバル関数を格納する
	std::function<void(int)> func_0 = print_gloval;
	func_0(0); // 0

	// ラムダ式関数を格納する
	std::function<void(int)> func_1 = print_lambda;
	func_1(1); // 1

	// メンバ関数を格納する
	std::function<void(const Object&, int)> func_2 = &Object::print;
	Object obj;
	func_2(obj, 2); // 2

	// 関数テンプレート std::bind は関数のための転送呼び出しラッパーを生成する
	// このラッパーを呼び出すと関数にバインドされ、その引数の一部とargsを呼び出すことと同じ
	std::function<void()> func_3 = std::bind(print_gloval, 3);
	func_3(); // 3

	std::function<void()> func_4 = std::bind(&Object::print, &obj, 4);
	func_4(); // 4

	std::function<void()> func_5 = std::bind(print_lambda, 5); // VS2010 NG

	return 0;
}