1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Indirect Iterator</title> 5<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../index.html" title="Chapter 1. Boost.Iterator"> 8<link rel="up" href="../specialized.html" title="Specialized Adaptors"> 9<link rel="prev" href="function_output.html" title="Function Output Iterator"> 10<link rel="next" href="permutation.html" title="Permutation Iterator"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="function_output.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="permutation.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h3 class="title"> 27<a name="iterator.specialized.indirect"></a><a class="link" href="indirect.html" title="Indirect Iterator">Indirect Iterator</a> 28</h3></div></div></div> 29<p> 30 <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> adapts 31 an iterator by applying an <span class="bold"><strong>extra</strong></span> dereference 32 inside of <code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code>. 33 For example, this iterator adaptor makes it possible to view a container 34 of pointers (e.g. <code class="computeroutput"><span class="identifier">list</span><span class="special"><</span><span class="identifier">foo</span><span class="special">*></span></code>) 35 as if it were a container of the pointed-to type (e.g. <code class="computeroutput"><span class="identifier">list</span><span class="special"><</span><span class="identifier">foo</span><span class="special">></span></code>). <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> 36 depends on two auxiliary traits, <code class="computeroutput"><span class="identifier">pointee</span></code> 37 and <code class="computeroutput"><span class="identifier">indirect_reference</span></code>, to 38 provide support for underlying iterators whose <code class="computeroutput"><span class="identifier">value_type</span></code> 39 is not an iterator. 40 </p> 41<h3> 42<a name="iterator.specialized.indirect.h0"></a> 43 <span class="phrase"><a name="iterator.specialized.indirect.example"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.example">Example</a> 44 </h3> 45<p> 46 This example prints an array of characters, using <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> 47 to access the array of characters through an array of pointers. Next <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> is used with the <code class="computeroutput"><span class="identifier">transform</span></code> algorithm to copy the characters 48 (incremented by one) to another array. A constant indirect iterator is used 49 for the source and a mutable indirect iterator is used for the destination. 50 The last part of the example prints the original array of characters, but 51 this time using the <code class="computeroutput"><span class="identifier">make_indirect_iterator</span></code> 52 helper function. 53 </p> 54<pre class="programlisting"><span class="keyword">char</span> <span class="identifier">characters</span><span class="special">[]</span> <span class="special">=</span> <span class="string">"abcdefg"</span><span class="special">;</span> 55<span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">N</span> <span class="special">=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">characters</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">char</span><span class="special">)</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span> <span class="comment">// -1 since characters has a null char</span> 56<span class="keyword">char</span><span class="special">*</span> <span class="identifier">pointers_to_chars</span><span class="special">[</span><span class="identifier">N</span><span class="special">];</span> <span class="comment">// at the end.</span> 57<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">N</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 58 <span class="identifier">pointers_to_chars</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">characters</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span> 59 60<span class="comment">// Example of using indirect_iterator</span> 61 62<span class="identifier">boost</span><span class="special">::</span><span class="identifier">indirect_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">**,</span> <span class="keyword">char</span><span class="special">></span> 63 <span class="identifier">indirect_first</span><span class="special">(</span><span class="identifier">pointers_to_chars</span><span class="special">),</span> <span class="identifier">indirect_last</span><span class="special">(</span><span class="identifier">pointers_to_chars</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">);</span> 64 65<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">indirect_first</span><span class="special">,</span> <span class="identifier">indirect_last</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">","</span><span class="special">));</span> 66<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 67 68 69<span class="comment">// Example of making mutable and constant indirect iterators</span> 70 71<span class="keyword">char</span> <span class="identifier">mutable_characters</span><span class="special">[</span><span class="identifier">N</span><span class="special">];</span> 72<span class="keyword">char</span><span class="special">*</span> <span class="identifier">pointers_to_mutable_chars</span><span class="special">[</span><span class="identifier">N</span><span class="special">];</span> 73<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">N</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> 74 <span class="identifier">pointers_to_mutable_chars</span><span class="special">[</span><span class="identifier">j</span><span class="special">]</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">mutable_characters</span><span class="special">[</span><span class="identifier">j</span><span class="special">];</span> 75 76<span class="identifier">boost</span><span class="special">::</span><span class="identifier">indirect_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">*</span> <span class="keyword">const</span><span class="special">*></span> <span class="identifier">mutable_indirect_first</span><span class="special">(</span><span class="identifier">pointers_to_mutable_chars</span><span class="special">),</span> 77 <span class="identifier">mutable_indirect_last</span><span class="special">(</span><span class="identifier">pointers_to_mutable_chars</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">);</span> 78<span class="identifier">boost</span><span class="special">::</span><span class="identifier">indirect_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">*</span> <span class="keyword">const</span><span class="special">*,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">></span> <span class="identifier">const_indirect_first</span><span class="special">(</span><span class="identifier">pointers_to_chars</span><span class="special">),</span> 79 <span class="identifier">const_indirect_last</span><span class="special">(</span><span class="identifier">pointers_to_chars</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">);</span> 80 81<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">const_indirect_first</span><span class="special">,</span> <span class="identifier">const_indirect_last</span><span class="special">,</span> 82 <span class="identifier">mutable_indirect_first</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="keyword">char</span><span class="special">>(),</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">::</span><span class="identifier">_1</span><span class="special">));</span> 83 84<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">mutable_indirect_first</span><span class="special">,</span> <span class="identifier">mutable_indirect_last</span><span class="special">,</span> 85 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">","</span><span class="special">));</span> 86<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 87 88 89<span class="comment">// Example of using make_indirect_iterator()</span> 90 91<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_indirect_iterator</span><span class="special">(</span><span class="identifier">pointers_to_chars</span><span class="special">),</span> 92 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_indirect_iterator</span><span class="special">(</span><span class="identifier">pointers_to_chars</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">),</span> 93 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">","</span><span class="special">));</span> 94<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 95</pre> 96<p> 97 The output is: 98 </p> 99<pre class="programlisting">a,b,c,d,e,f,g, 100b,c,d,e,f,g,h, 101a,b,c,d,e,f,g, 102</pre> 103<p> 104 The source code for this example can be found <a href="../../../../example/indirect_iterator_example.cpp" target="_top">here</a>. 105 </p> 106<h3> 107<a name="iterator.specialized.indirect.h1"></a> 108 <span class="phrase"><a name="iterator.specialized.indirect.reference"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.reference">Reference</a> 109 </h3> 110<h4> 111<a name="iterator.specialized.indirect.h2"></a> 112 <span class="phrase"><a name="iterator.specialized.indirect.synopsis"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.synopsis">Synopsis</a> 113 </h4> 114<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span> 115 <span class="keyword">class</span> <span class="identifier">Iterator</span> 116 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="identifier">use_default</span> 117 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CategoryOrTraversal</span> <span class="special">=</span> <span class="identifier">use_default</span> 118 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Reference</span> <span class="special">=</span> <span class="identifier">use_default</span> 119 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Difference</span> <span class="special">=</span> <span class="identifier">use_default</span> 120<span class="special">></span> 121<span class="keyword">class</span> <span class="identifier">indirect_iterator</span> 122<span class="special">{</span> 123 <span class="keyword">public</span><span class="special">:</span> 124 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">value_type</span><span class="special">;</span> 125 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">reference</span><span class="special">;</span> 126 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">pointer</span><span class="special">;</span> 127 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">difference_type</span><span class="special">;</span> 128 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">iterator_category</span><span class="special">;</span> 129 130 <span class="identifier">indirect_iterator</span><span class="special">();</span> 131 <span class="identifier">indirect_iterator</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">);</span> 132 133 <span class="keyword">template</span> <span class="special"><</span> 134 <span class="keyword">class</span> <span class="identifier">Iterator2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Value2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Category2</span> 135 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Reference2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Difference2</span> 136 <span class="special">></span> 137 <span class="identifier">indirect_iterator</span><span class="special">(</span> 138 <span class="identifier">indirect_iterator</span><span class="special"><</span> 139 <span class="identifier">Iterator2</span><span class="special">,</span> <span class="identifier">Value2</span><span class="special">,</span> <span class="identifier">Category2</span><span class="special">,</span> <span class="identifier">Reference2</span><span class="special">,</span> <span class="identifier">Difference2</span> 140 <span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">y</span> 141 <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special"><</span><span class="identifier">Iterator2</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition</span> 142 <span class="special">);</span> 143 144 <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">base</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 145 <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 146 <span class="identifier">indirect_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">++();</span> 147 <span class="identifier">indirect_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">--();</span> 148<span class="keyword">private</span><span class="special">:</span> 149 <span class="identifier">Iterator</span> <span class="identifier">m_iterator</span><span class="special">;</span> <span class="comment">// exposition</span> 150<span class="special">};</span> 151</pre> 152<p> 153 The member types of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> 154 are defined according to the following pseudo-code, where <code class="computeroutput"><span class="identifier">V</span></code> 155 is <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span></code> 156 </p> 157<pre class="programlisting"> if (Value is use_default) then 158 typedef remove_const<pointee<V>::type>::type value_type; 159 else 160 typedef remove_const<Value>::type value_type; 161 162 if (Reference is use_default) then 163 if (Value is use_default) then 164 typedef indirect_reference<V>::type reference; 165 else 166 typedef Value& reference; 167 else 168 typedef Reference reference; 169 170 if (Value is use_default) then 171 typedef pointee<V>::type* pointer; 172 else 173 typedef Value* pointer; 174 175 if (Difference is use_default) 176 typedef iterator_traits<Iterator>::difference_type difference_type; 177 else 178 typedef Difference difference_type; 179 180 if (CategoryOrTraversal is use_default) 181 typedef <span class="bold"><strong>iterator-category</strong></span> ( 182 iterator_traversal<Iterator>::type,<code class="computeroutput"><span class="identifier">reference</span></code>,<code class="computeroutput"><span class="identifier">value_type</span></code> 183 ) iterator_category; 184 else 185 typedef <span class="bold"><strong>iterator-category</strong></span> ( 186 CategoryOrTraversal,<code class="computeroutput"><span class="identifier">reference</span></code>,<code class="computeroutput"><span class="identifier">value_type</span></code> 187 ) iterator_category; 188</pre> 189<h4> 190<a name="iterator.specialized.indirect.h3"></a> 191 <span class="phrase"><a name="iterator.specialized.indirect.requirements"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.requirements">Requirements</a> 192 </h4> 193<p> 194 The expression <code class="computeroutput"><span class="special">*</span><span class="identifier">v</span></code>, 195 where <code class="computeroutput"><span class="identifier">v</span></code> is an object of 196 <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span></code>, shall be valid expression and 197 convertible to <code class="computeroutput"><span class="identifier">reference</span></code>. 198 <code class="computeroutput"><span class="identifier">Iterator</span></code> shall model the 199 traversal concept indicated by <code class="computeroutput"><span class="identifier">iterator_category</span></code>. 200 <code class="computeroutput"><span class="identifier">Value</span></code>, <code class="computeroutput"><span class="identifier">Reference</span></code>, 201 and <code class="computeroutput"><span class="identifier">Difference</span></code> shall be chosen 202 so that <code class="computeroutput"><span class="identifier">value_type</span></code>, <code class="computeroutput"><span class="identifier">reference</span></code>, and <code class="computeroutput"><span class="identifier">difference_type</span></code> 203 meet the requirements indicated by <code class="computeroutput"><span class="identifier">iterator_category</span></code>. 204 </p> 205<div class="blurb"> 206<div class="titlepage"><div><div><p class="title"><b></b></p></div></div></div> 207<p> 208 Note: there are further requirements on the <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span></code> 209 if the <code class="computeroutput"><span class="identifier">Value</span></code> parameter is 210 not <code class="computeroutput"><span class="identifier">use_default</span></code>, as implied 211 by the algorithm for deducing the default for the <code class="computeroutput"><span class="identifier">value_type</span></code> 212 member. 213 </p> 214</div> 215<h4> 216<a name="iterator.specialized.indirect.h4"></a> 217 <span class="phrase"><a name="iterator.specialized.indirect.concepts"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.concepts">Concepts</a> 218 </h4> 219<p> 220 In addition to the concepts indicated by <code class="computeroutput"><span class="identifier">iterator_category</span></code> 221 and by <code class="computeroutput"><span class="identifier">iterator_traversal</span><span class="special"><</span><span class="identifier">indirect_iterator</span><span class="special">>::</span><span class="identifier">type</span></code>, 222 a specialization of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> 223 models the following concepts, Where <code class="computeroutput"><span class="identifier">v</span></code> 224 is an object of <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span></code>: 225 </p> 226<p> 227 Readable Iterator if <code class="computeroutput"><span class="identifier">reference</span><span class="special">(*</span><span class="identifier">v</span><span class="special">)</span></code> 228 is convertible to <code class="computeroutput"><span class="identifier">value_type</span></code>. 229 </p> 230<p> 231 Writable Iterator if <code class="computeroutput"><span class="identifier">reference</span><span class="special">(*</span><span class="identifier">v</span><span class="special">)</span> 232 <span class="special">=</span> <span class="identifier">t</span></code> 233 is a valid expression (where <code class="computeroutput"><span class="identifier">t</span></code> 234 is an object of type <code class="computeroutput"><span class="identifier">indirect_iterator</span><span class="special">::</span><span class="identifier">value_type</span></code>) 235 </p> 236<p> 237 Lvalue Iterator if <code class="computeroutput"><span class="identifier">reference</span></code> 238 is a reference type. 239 </p> 240<p> 241 <code class="computeroutput"><span class="identifier">indirect_iterator</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">V1</span><span class="special">,</span><span class="identifier">C1</span><span class="special">,</span><span class="identifier">R1</span><span class="special">,</span><span class="identifier">D1</span><span class="special">></span></code> is interoperable with <code class="computeroutput"><span class="identifier">indirect_iterator</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">V2</span><span class="special">,</span><span class="identifier">C2</span><span class="special">,</span><span class="identifier">R2</span><span class="special">,</span><span class="identifier">D2</span><span class="special">></span></code> 242 if and only if <code class="computeroutput"><span class="identifier">X</span></code> is interoperable 243 with <code class="computeroutput"><span class="identifier">Y</span></code>. 244 </p> 245<h4> 246<a name="iterator.specialized.indirect.h5"></a> 247 <span class="phrase"><a name="iterator.specialized.indirect.operations"></a></span><a class="link" href="indirect.html#iterator.specialized.indirect.operations">Operations</a> 248 </h4> 249<p> 250 In addition to the operations required by the concepts described above, specializations 251 of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> provide 252 the following operations: 253 </p> 254<pre class="programlisting"><span class="identifier">indirect_iterator</span><span class="special">();</span> 255</pre> 256<p> 257 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="identifier">Iterator</span></code> 258 must be Default Constructible.<br> <span class="bold"><strong>Effects: </strong></span> 259 Constructs an instance of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> 260 with a default-constructed <code class="computeroutput"><span class="identifier">m_iterator</span></code>. 261 </p> 262<pre class="programlisting"><span class="identifier">indirect_iterator</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">);</span> 263</pre> 264<p> 265 <span class="bold"><strong>Effects: </strong></span> Constructs an instance of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> with <code class="computeroutput"><span class="identifier">m_iterator</span></code> 266 copy constructed from <code class="computeroutput"><span class="identifier">x</span></code>. 267 </p> 268<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span> 269 <span class="keyword">class</span> <span class="identifier">Iterator2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Value2</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">Access</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traversal</span> 270 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Reference2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Difference2</span> 271<span class="special">></span> 272<span class="identifier">indirect_iterator</span><span class="special">(</span> 273 <span class="identifier">indirect_iterator</span><span class="special"><</span> 274 <span class="identifier">Iterator2</span><span class="special">,</span> <span class="identifier">Value2</span><span class="special">,</span> <span class="identifier">Access</span><span class="special">,</span> <span class="identifier">Traversal</span><span class="special">,</span> <span class="identifier">Reference2</span><span class="special">,</span> <span class="identifier">Difference2</span> 275 <span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">y</span> 276 <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special"><</span><span class="identifier">Iterator2</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition</span> 277<span class="special">);</span> 278</pre> 279<p> 280 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="identifier">Iterator2</span></code> 281 is implicitly convertible to <code class="computeroutput"><span class="identifier">Iterator</span></code>.<br> 282 <span class="bold"><strong>Effects: </strong></span> Constructs an instance of <code class="computeroutput"><span class="identifier">indirect_iterator</span></code> whose <code class="computeroutput"><span class="identifier">m_iterator</span></code> 283 subobject is constructed from <code class="computeroutput"><span class="identifier">y</span><span class="special">.</span><span class="identifier">base</span><span class="special">()</span></code>. 284 </p> 285<pre class="programlisting"><span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">base</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 286</pre> 287<p> 288 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">m_iterator</span></code> 289 </p> 290<pre class="programlisting"><span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 291</pre> 292<p> 293 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">**</span><span class="identifier">m_iterator</span></code> 294 </p> 295<pre class="programlisting"><span class="identifier">indirect_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">++();</span> 296</pre> 297<p> 298 <span class="bold"><strong>Effects: </strong></span> <code class="computeroutput"><span class="special">++</span><span class="identifier">m_iterator</span></code><br> <span class="bold"><strong>Returns: 299 </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 300 </p> 301<pre class="programlisting"><span class="identifier">indirect_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">--();</span> 302</pre> 303<p> 304 <span class="bold"><strong>Effects: </strong></span> <code class="computeroutput"><span class="special">--</span><span class="identifier">m_iterator</span></code><br> <span class="bold"><strong>Returns: 305 </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 306 </p> 307</div> 308<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 309<td align="left"></td> 310<td align="right"><div class="copyright-footer">Copyright © 2003, 2005 David Abrahams Jeremy Siek Thomas 311 Witt<p> 312 Distributed under the Boost Software License, Version 1.0. (See accompanying 313 file LICENSE_1_0.txt or copy at <ulink url="http://www.boost.org/LICENSE_1_0.txt"> 314 http://www.boost.org/LICENSE_1_0.txt </ulink>) 315 </p> 316</div></td> 317</tr></table> 318<hr> 319<div class="spirit-nav"> 320<a accesskey="p" href="function_output.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="permutation.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 321</div> 322</body> 323</html> 324