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
partially specialized result_of for lambda