読者です 読者をやめる 読者になる 読者になる

Boost.ScopeExit thisのキャプチャ

C++

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