Boost 1.50.0になり、Boost.ScopeExitでthisのキャプチャがC++03でできるようになりました。
C++03でthisをキャプチャするには、BOOST_SCOPE_EXITにthis_を指定します(末尾にアンダーバー)。
// C++03 #include <iostream> #include <vector> #include <string> #include <boost/scope_exit.hpp> #include <boost/bind.hpp> #include <boost/range/algorithm/for_each.hpp> struct person { int id; std::string name; person(int id, const std::string& name) : id(id), name(name) {} void print() { std::cout << name << std::endl; } }; class world { std::vector<person> persons_; public: void add_person(const person& p) { bool commit = false; BOOST_SCOPE_EXIT(&commit, this_) { if (!commit) this_->persons_.pop_back(); // this_経由でprivateメンバにアクセス } BOOST_SCOPE_EXIT_END persons_.push_back(p); if (p.id > 0) commit = true; } void print() { boost::for_each(persons_, boost::bind(&person::print, _1)); } }; int main() { world w; w.add_person(person(10, "Alice")); w.add_person(person(-1, "Bob")); w.print(); }
Alice
このコードはC++11環境でも動作します。C++11環境の場合は、this_の代わりに直接thisを使用しても大丈夫です。
参照:
Capturing The Object this - Boost 1.50.0 Documentation
※
Boost 1.50.0のBoost.ScopeExitドキュメントで、Tutorialページがところどころリンク切れしてます。
リンクを「Tutorial」から「tutorial」に修正すれば見れます。作者に報告済み。1.51.0で修正するそうです。
【1.50.0】【scope exit】 dead link documentation