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[][];[]
[] }[]
[]}[]