shared_container_iterator

  • BOOST_FOREACHは、一時オブジェクトをコピーして保持するが、当然、元のソースまでは手に負えない
    • 元の一時オブジェクト std::string("abc") は、BOOST_FOREACHのループ内で使うころには消えている
  • BOOST_FOREACHで使えるようにするために、iterator自身がリソースを管理しなくてはならない場合がある
    • これではRangeがリソースを管理できるという利点が失われてしまう
    • BOOST_FOREACHの存在が、Rangeの設計に影響を与えてしまうということ
  • そこで、boost::shared_container_iteratorから作ったshare_range・・・ソースコード
  • リソースをiteratorが管理するという特性を後からRangeに追加できる

[]#include[] []<pstade/oven/share_range.hpp>[]
[]#include[] []<pstade/oven/sort_range.hpp>[]
[]#include[] []<algorithm>[]
[]#include[] []<iostream>[]
[]#include[] []<string>[]
[]#include[] []<boost/foreach.hpp>[]

[]using[] []boost[][]::[][]unit_test[][]::[][]test_suite[][];[]


[]template[][]< [][]class[] []Range[][], [][]class[] []Fun[][] >[]
[]Fun[] []for_each_ex[][]([][]const[] []Range[][]& [][]rng[][], [][]Fun[] []f[][])[]
[]{[]
[]return[] []std[][]::[][]for_each[][]([][]boost[][]::[][]begin[][]([][]rng[][]), [][]boost[][]::[][]end[][]([][]rng[][]), [][]f[][]);[]
[]}[]

[]void[] []output[][]([][]char[] []ch[][]) { [][]std[][]::[][]cout[][] << [][]ch[][]; }[]


[]void[] []test[][]()[]
[]{[]
[]using[] []namespace[] []pstade[][];[]

[]std[][]::[][]string[] []str[][]([][]"abc"[][]);[]
[]BOOST_FOREACH[][] ([][]char[] []ch[][], [][]str[][]) {[]
[]std[][]::[][]cout[][] << [][]ch[][];[]
[] }[]

[]BOOST_FOREACH[][] ([][]char[] []ch[][], [][]std[][]::[][]string[][]([][]"abc"[][])) {[]
[]std[][]::[][]cout[][] << [][]ch[][];[]
[] }[]

[] ::[][]for_each_ex[][]([][]boost[][]::[][]make_iterator_range[][]([][]std[][]::[][]string[][]([][]"abc"[][])), [][]output[][]);[]

[]/*[]
[] BOOST_FOREACH (char ch, boost::make_iterator_range(std::string("abc"))) { // crash![]
[] std::cout << ch;[]
[] }[]
[]*/[]

[]BOOST_FOREACH[][] ([][]char[] []ch[][], [][]boost[][]::[][]make_iterator_range[][]([][]new[] []std[][]::[][]string[][]([][]"abc"[][])|[][]oven[][]::[][]shared[][])) {[]
[]std[][]::[][]cout[][] << [][]ch[][];[]
[] }[]

[]BOOST_FOREACH[][] ([][]char[] []ch[][], [][]new[] []std[][]::[][]string[][]([][]"cba"[][])|[][]oven[][]::[][]shared[][]|[][]oven[][]::[][]sorted[][]) {[]
[]std[][]::[][]cout[][] << [][]ch[][];[]
[] }[]
[]}[]