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

pstade::oven::copiedを移植

C++

to_containerという名前にしました。

この名前にした理由は以下:

  • copiedという名前はBoost.Rangeがすでに別の意味で使っている
  • constructedという名称案も出たが、名前のスコープが広すぎたのでやめた
  • 機能的な意味としてはrange convert to "container convertible range"
  • T(r.begin(), r.end())というコンストラクタはコンテナ固有なので、to_containerという名前にした
  • Rangeアダプタではないので、過去分詞にこだわる必要はとくにない
  • 他の型に変換したいという要求があった場合は特殊化ではなく別名で対処する
  • 特殊化は型ごとに決め打ちの構築方法が必要となるが、pair/tupleのRangeなどで分岐が必要になってきたときに設計が無理が出てきそう

使い方はpstade::oven::copiedと同じく、パイプ演算子を使用したスタイル、関数スタイルどちらでも使えます。

#include <vector>
#include <boost/assign/list_of.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/to_container.hpp>
#include <boost/range/algorithm/for_each.hpp>

bool is_odd(int x) { return x % 2 == 0; }
void disp(int x) { std::cout << x << ' '; }

int main()
{
    // pipe operator style
    {
        const std::vector<int> v1 = boost::assign::list_of(1)(2)(3)(4)(5);
        const std::vector<int> v2 = v1 | boost::adaptors::filtered(is_odd) | boost::to_container;

        boost::for_each(v2, disp);
    }
    std::cout << std::endl;

    // function style
    {
        const std::vector<int> v1 = boost::assign::list_of(1)(2)(3)(4)(5);
        const std::vector<int> v2 = boost::to_container(boost::adaptors::filter(v1, is_odd));

        boost::for_each(v2, disp);
    }
}
2 4 
2 4