きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

scope_exitの実装

スコープを抜けたら何らかの処理を実行する物を作りました。

使用例

C* p = new C(1, 2);
auto s = mytools::make_scope_exit([&p]() {
	delete p;
});

実装

template <typename Func>
class scope_exit {
public:
	scope_exit(Func func) : func(func) {}
	~scope_exit() {
		func();
	}
private:
	Func func;
};

template <typename Func>
static scope_exit<Func> make_scope_exit(Func func) {
	return scope_exit<Func>(func);
}

とはいえ、単にデストラクタで保持した関数を実行するだけです。テンプレートで保存することでコストの高いstd::function等を利用しなくて済むところがポイントですね。また、make_scope_exit関数を別に用意することでわざわざ型を指定する必要がなくなります。