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

boost::lambdaのbindはスマートポインタのコンテナで使えない

C++

【Bind】【Lambda】 Processing containers of pointers


らしい。
mem_fn的なことはしてくれないのか、と思ったらポインタはできるのね。

#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>

struct hoge {
    void f() {}
};

int main()
{
    using namespace boost::lambda;

    std::vector<hoge>                     vh;
    std::vector<hoge*>                    vp;
    std::vector<boost::shared_ptr<hoge> > vs;

    std::for_each(vh.begin(), vh.end(), bind(&hoge::f, _1)); // OK
    std::for_each(vp.begin(), vp.end(), bind(&hoge::f, _1)); // OK
//  std::for_each(vs.begin(), vs.end(), bind(&hoge::f, _1)); // エラー
}

boost::bindではできるのに。

#include <vector>
#include <algorithm>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>

struct hoge {
    void f() {}
};

int main()
{
    std::vector<hoge>                     vh;
    std::vector<hoge*>                    vp;
    std::vector<boost::shared_ptr<hoge> > vs;

    std::for_each(vh.begin(), vh.end(), boost::bind(&hoge::f, _1)); // OK
    std::for_each(vp.begin(), vp.end(), boost::bind(&hoge::f, _1)); // OK
    std::for_each(vs.begin(), vs.end(), boost::bind(&hoge::f, _1)); // OK
}