oven::transformed

oven::transformedは、範囲の全要素に指定された関数を適用するRangeアダプタです。
いわゆるmap操作です。


以下の例では、範囲の全要素を+1しています。

#include <vector>
#include <boost/assert.hpp>
#include <pstade/oven/transformed.hpp>
#include <pstade/oven/initial_values.hpp>
#include <pstade/oven/equals.hpp>

using namespace pstade::oven;

struct increment {
    typedef int result_type;

    int operator()(int x) const
        { return x + 1; }
};

int main()
{
    const std::vector<int> v = initial_values(1, 2, 3);

    BOOST_ASSERT(equals(v|transformed(increment()),
                        initial_values(2, 3, 4)));
}


要素の型を変換することもできます。
transformed内では変換関数の戻り値の型をboost::result_ofで調べて
その型を要素とするiterator rangeを作成しています。

#include <vector>
#include <string>
#include <sstream>
#include <boost/assert.hpp>
#include <pstade/oven/transformed.hpp>
#include <pstade/oven/initial_values.hpp>
#include <pstade/oven/equals.hpp>

using namespace pstade::oven;

struct to_string {
    typedef std::string result_type;

    template <class T>
    std::string operator()(T x) const
    {
        std::stringstream ss;
        ss << x;
        return ss.str();
    }
};

int main()
{
    const std::vector<int> v = initial_values(1, 2, 3);

    BOOST_ASSERT(equals(v|transformed(to_string()),
                        initial_values("1", "2", "3")));
}

Boost 1.41.0時点でのBoost.Lambdaはboost::result_ofで戻り値の型を取得することができないので
transformedにBoost.Lambdaを適用するには<pstade/result_of_lambda.hpp>をインクルードする必要があります。

#include <vector>
#include <boost/assert.hpp>
#include <boost/lambda/lambda.hpp>
#include <pstade/result_of_lambda.hpp>
#include <pstade/oven/transformed.hpp>
#include <pstade/oven/initial_values.hpp>
#include <pstade/oven/equals.hpp>

using namespace pstade::oven;
using boost::lambda::_1;

int main()
{
    const std::vector<int> v = initial_values(1, 2, 3);

    BOOST_ASSERT(equals(v|transformed(_1 + 1),
                        initial_values(2, 3, 4)));
}

【参照】
pstade::oven::transformed

pstade/egg/bll/result_of.hpp

partially specialized result_of for lambda