Boost.ScopeExit使ってみた

ScopeExitはスコープを抜けたときに実行されるブロックを定義できます。
C++0xのラムダ式風に変数をキャプチャすることができます。

#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/scope_exit.hpp>

using namespace std;

vector<int> v;

void foo()
{
    int index = 1;
    v.push_back(1);

    // スコープ抜けたらこのブロックを実行(indexはコピー、vは参照でキャプチャ)
    BOOST_SCOPE_EXIT((index)(&v)) {
        v[index] = 8;
        v.pop_back();
    } BOOST_SCOPE_EXIT_END;

    v.push_back(2);
    v.push_back(3);
}

int main()
{
    foo();

    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n")); // 1, 8
}