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

transformed + Boost.Lambda + regularでメンバ変数を抽出する

C++

※このコードは現在作成中のライブラリを使用したものです。
OvenToBoost - github

#include <iostream>
#include <vector>
#include <string>
#include <boost/assign/list_of.hpp>
#include <boost/range/adaptor/regular_extension/transformed.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/lambda/lambda.hpp>

struct X {
    int a;
    std::string s;

    X(int a_, const std::string& s_) : a(a_), s(s_) {}
};

struct disper {
    template <class T>
    void operator()(const T& x) const
    {
        std::cout << x << std::endl;
    }
};

int main()
{
    const std::vector<X> v = boost::assign::list_of
        (X(1, "a"))
        (X(2, "b"))
        (X(3, "c"))
        ;

    using boost::lambda::_1;

    boost::for_each(v |+ boost::adaptors::transformed(&_1 ->* &X::s), disper());
}
a
b
c

RangeをconstにするとC++03で動作しないので調査中。

#include <pstade/result_of_lambda.hpp>

を入れたら動作したのでBoost.Lambdaのresult_of対応がダメなのかもしれない。
それかindirect_functorのresult_typeの計算が間違ってる・・・。