1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Type Traits</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="../utilities.html" title="Utilities"> 9<link rel="prev" href="iterator_traits.html" title="Iterator Traits"> 10<link rel="next" href="../algorithms.html" title="Algorithms"> 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="iterator_traits.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../utilities.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="../algorithms.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.utilities.traits"></a><a class="link" href="traits.html" title="Type Traits">Type Traits</a> 28</h3></div></div></div> 29<h3> 30<a name="iterator.utilities.traits.h0"></a> 31 <span class="phrase"><a name="iterator.utilities.traits.overview"></a></span><a class="link" href="traits.html#iterator.utilities.traits.overview">Overview</a> 32 </h3> 33<p> 34 Have you ever wanted to write a generic function that can operate on any 35 kind of dereferenceable object? If you have, you've probably run into the 36 problem of how to determine the type that the object "points at": 37 </p> 38<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">></span> 39<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">Dereferenceable</span> <span class="identifier">p</span><span class="special">)</span> 40<span class="special">{</span> 41 <span class="special">*</span><span class="identifier">what</span><span class="special">-</span><span class="identifier">goes</span><span class="special">-</span><span class="identifier">here</span><span class="special">?*</span> <span class="identifier">value</span> <span class="special">=</span> <span class="special">\*</span><span class="identifier">p</span><span class="special">;</span> 42 <span class="special">...</span> 43<span class="special">}</span> 44</pre> 45<h3> 46<a name="iterator.utilities.traits.h1"></a> 47 <span class="phrase"><a name="iterator.utilities.traits.pointee"></a></span><a class="link" href="traits.html#iterator.utilities.traits.pointee"><code class="computeroutput"><span class="identifier">pointee</span></code></a> 48 </h3> 49<p> 50 It turns out to be impossible to come up with a fully-general algorithm to 51 do determine <span class="bold"><strong>what-goes-here</strong></span> directly, but 52 it is possible to require that <code class="computeroutput"><span class="identifier">pointee</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">type</span></code> 53 is correct. Naturally, <code class="computeroutput"><span class="identifier">pointee</span></code> 54 has the same difficulty: it can't determine the appropriate <code class="computeroutput"><span class="special">::</span><span class="identifier">type</span></code> 55 reliably for all <code class="computeroutput"><span class="identifier">Dereferenceable</span></code>s, 56 but it makes very good guesses (it works for all pointers, standard and boost 57 smart pointers, and iterators), and when it guesses wrongly, it can be specialized 58 as necessary: 59 </p> 60<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> 61<span class="special">{</span> 62 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 63 <span class="keyword">struct</span> <span class="identifier">pointee</span><span class="special"><</span><span class="identifier">third_party_lib</span><span class="special">::</span><span class="identifier">smart_pointer</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> 64 <span class="special">{</span> 65 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span> 66 <span class="special">};</span> 67<span class="special">}</span> 68</pre> 69<h3> 70<a name="iterator.utilities.traits.h2"></a> 71 <span class="phrase"><a name="iterator.utilities.traits.indirect_reference"></a></span><a class="link" href="traits.html#iterator.utilities.traits.indirect_reference"><code class="computeroutput"><span class="identifier">indirect_reference</span></code></a> 72 </h3> 73<p> 74 <code class="computeroutput"><span class="identifier">indirect_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> is rather more specialized than <code class="computeroutput"><span class="identifier">pointee</span></code>, and is meant to be used to forward 75 the result of dereferencing an object of its argument type. Most dereferenceable 76 types just return a reference to their pointee, but some return proxy references 77 or return the pointee by value. When that information is needed, call on 78 <code class="computeroutput"><span class="identifier">indirect_reference</span></code>. 79 </p> 80<p> 81 Both of these templates are essential to the correct functioning of <a class="link" href="../specialized/indirect.html" title="Indirect Iterator"><code class="computeroutput"><span class="identifier">indirect_iterator</span></code></a>. 82 </p> 83<h3> 84<a name="iterator.utilities.traits.h3"></a> 85 <span class="phrase"><a name="iterator.utilities.traits.minimum_category"></a></span><a class="link" href="traits.html#iterator.utilities.traits.minimum_category"><code class="computeroutput"><span class="identifier">minimum_category</span></code></a> 86 </h3> 87<p> 88 <code class="computeroutput"><span class="identifier">minimum_category</span></code> takes two 89 iterator categories or two iterator traversal tags and returns the one that 90 is the weakest (i.e. least advanced). For example: 91 </p> 92<pre class="programlisting"><span class="keyword">static_assert</span><span class="special">(</span> 93 <span class="identifier">is_same</span><span class="special"><</span> 94 <span class="identifier">minimum_category</span><span class="special"><</span> 95 <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward_iterator_tag</span><span class="special">,</span> 96 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span> 97 <span class="special">>::</span><span class="identifier">type</span><span class="special">,</span> 98 <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward_iterator_tag</span> 99 <span class="special">>::</span><span class="identifier">value</span><span class="special">,</span> 100 <span class="string">"Unexpected minimum_category result"</span> 101<span class="special">);</span> 102</pre> 103<h3> 104<a name="iterator.utilities.traits.h4"></a> 105 <span class="phrase"><a name="iterator.utilities.traits.iterator_category_and_traversal_"></a></span><a class="link" href="traits.html#iterator.utilities.traits.iterator_category_and_traversal_">Iterator 106 category and traversal tags manipulation</a> 107 </h3> 108<p> 109 The library provides several utilities to simplify conversions between iterator 110 categories and traversal tags: 111 </p> 112<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 113<li class="listitem"> 114 <code class="computeroutput"><span class="identifier">iterator_category_to_traversal</span><span class="special"><</span><span class="identifier">C</span><span class="special">>::</span><span class="identifier">type</span></code> 115 - the metafunction takes an iterator category <code class="computeroutput"><span class="identifier">C</span></code> 116 and returns the corresponding traversal tag. 117 </li> 118<li class="listitem"> 119 <code class="computeroutput"><span class="identifier">iterator_traversal</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> - a shorthand for <code class="computeroutput"><span class="identifier">iterator_category_to_traversal</span><span class="special"><</span><span class="identifier">iterator_category</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">type</span></code>. 120 </li> 121<li class="listitem"> 122 <code class="computeroutput"><span class="identifier">pure_traversal_tag</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> - the metafunction takes a tag 123 <code class="computeroutput"><span class="identifier">T</span></code> which derives from 124 one of the iterator traversal tags and returns that traversal tag. <code class="computeroutput"><span class="identifier">T</span></code> may also derive from other tags describing 125 the iterator (e.g. whether this is a <code class="computeroutput"><span class="keyword">const</span></code>-iterator 126 or not), these additional tags are not considered. 127 </li> 128<li class="listitem"> 129 <code class="computeroutput"><span class="identifier">pure_iterator_traversal</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> 130 - a shorthand for <code class="computeroutput"><span class="identifier">pure_traversal_tag</span><span class="special"><</span><span class="identifier">iterator_traversal</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">type</span></code>. 131 </li> 132</ul></div> 133<h3> 134<a name="iterator.utilities.traits.h5"></a> 135 <span class="phrase"><a name="iterator.utilities.traits.reference"></a></span><a class="link" href="traits.html#iterator.utilities.traits.reference">Reference</a> 136 </h3> 137<h4> 138<a name="iterator.utilities.traits.h6"></a> 139 <span class="phrase"><a name="iterator.utilities.traits.pointee0"></a></span><a class="link" href="traits.html#iterator.utilities.traits.pointee0"><code class="computeroutput"><span class="identifier">pointee</span></code></a> 140 </h4> 141<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">></span> 142<span class="keyword">struct</span> <span class="identifier">pointee</span> 143<span class="special">{</span> 144 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">type</span><span class="special">;</span> 145<span class="special">};</span> 146</pre> 147<p> 148 <span class="bold"><strong>Requires:</strong></span> For an object <code class="computeroutput"><span class="identifier">x</span></code> 149 of type <code class="computeroutput"><span class="identifier">Dereferenceable</span></code>, 150 <code class="computeroutput"><span class="special">*</span><span class="identifier">x</span></code> 151 is well-formed. If <code class="computeroutput"><span class="special">++</span><span class="identifier">x</span></code> 152 is ill-formed it shall neither be ambiguous nor shall it violate access control, 153 and <code class="computeroutput"><span class="identifier">Dereferenceable</span><span class="special">::</span><span class="identifier">element_type</span></code> shall be an accessible type. 154 Otherwise <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">value_type</span></code> 155 shall be well formed. [Note: These requirements need not apply to explicit 156 or partial specializations of <code class="computeroutput"><span class="identifier">pointee</span></code>] 157 </p> 158<p> 159 <code class="computeroutput"><span class="identifier">type</span></code> is determined according 160 to the following algorithm, where <code class="computeroutput"><span class="identifier">x</span></code> 161 is an object of type <code class="computeroutput"><span class="identifier">Dereferenceable</span></code>: 162 </p> 163<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span> <span class="special">++</span><span class="identifier">x</span> <span class="identifier">is</span> <span class="identifier">ill</span><span class="special">-</span><span class="identifier">formed</span> <span class="special">)</span> 164<span class="special">{</span> 165 <span class="keyword">return</span> <span class="identifier">Dereferenceable</span><span class="special">::</span><span class="identifier">element_type</span> 166<span class="special">}</span> 167<span class="keyword">else</span> <span class="keyword">if</span> <span class="special">(*</span><span class="identifier">x</span> <span class="identifier">is</span> <span class="identifier">a</span> <span class="keyword">mutable</span> <span class="identifier">reference</span> <span class="identifier">to</span> 168 <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">)</span> 169<span class="special">{</span> 170 <span class="keyword">return</span> <span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">value_type</span> 171<span class="special">}</span> 172<span class="keyword">else</span> 173<span class="special">{</span> 174 <span class="keyword">return</span> <span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="keyword">const</span> 175<span class="special">}</span> 176</pre> 177<h4> 178<a name="iterator.utilities.traits.h7"></a> 179 <span class="phrase"><a name="iterator.utilities.traits.indirect_reference0"></a></span><a class="link" href="traits.html#iterator.utilities.traits.indirect_reference0"><code class="computeroutput"><span class="identifier">indirect_reference</span></code></a> 180 </h4> 181<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">></span> 182<span class="keyword">struct</span> <span class="identifier">indirect_reference</span> 183<span class="special">{</span> 184 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">type</span><span class="special">;</span> 185<span class="special">};</span> 186</pre> 187<p> 188 <span class="bold"><strong>Requires:</strong></span> For an object <code class="computeroutput"><span class="identifier">x</span></code> 189 of type <code class="computeroutput"><span class="identifier">Dereferenceable</span></code>, 190 <code class="computeroutput"><span class="special">*</span><span class="identifier">x</span></code> 191 is well-formed. If <code class="computeroutput"><span class="special">++</span><span class="identifier">x</span></code> 192 is ill-formed it shall neither be ambiguous nor shall it violate access control, 193 and <code class="computeroutput"><span class="identifier">pointee</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">type</span><span class="special">&</span></code> 194 shall be well-formed. Otherwise <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">reference</span></code> 195 shall be well formed. [Note: These requirements need not apply to explicit 196 or partial specializations of <code class="computeroutput"><span class="identifier">indirect_reference</span></code>] 197 </p> 198<p> 199 <code class="computeroutput"><span class="identifier">type</span></code> is determined according 200 to the following algorithm, where <code class="computeroutput"><span class="identifier">x</span></code> 201 is an object of type <code class="computeroutput"><span class="identifier">Dereferenceable</span></code>: 202 </p> 203<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span> <span class="special">++</span><span class="identifier">x</span> <span class="identifier">is</span> <span class="identifier">ill</span><span class="special">-</span><span class="identifier">formed</span> <span class="special">)</span> 204 <span class="keyword">return</span> <span class="identifier">pointee</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">type</span><span class="special">&</span> 205<span class="keyword">else</span> 206 <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">Dereferenceable</span><span class="special">>::</span><span class="identifier">reference</span> 207</pre> 208<h4> 209<a name="iterator.utilities.traits.h8"></a> 210 <span class="phrase"><a name="iterator.utilities.traits.minimum_category0"></a></span><a class="link" href="traits.html#iterator.utilities.traits.minimum_category0"><code class="computeroutput"><span class="identifier">minimum_category</span></code></a> 211 </h4> 212<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C2</span><span class="special">></span> 213<span class="keyword">struct</span> <span class="identifier">minimum_category</span> 214<span class="special">{</span> 215 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">type</span><span class="special">;</span> 216<span class="special">};</span> 217</pre> 218<p> 219 <span class="bold"><strong>Requires:</strong></span> Both <code class="computeroutput"><span class="identifier">C1</span></code> 220 and <code class="computeroutput"><span class="identifier">C2</span></code> shall be standard 221 iterator categories or iterator traversal tags. 222 </p> 223<p> 224 <code class="computeroutput"><span class="identifier">type</span></code> is determined according 225 to the following algorithm, where <code class="computeroutput"><span class="identifier">c1</span></code> 226 is an object of type <code class="computeroutput"><span class="identifier">C1</span></code> and 227 <code class="computeroutput"><span class="identifier">c2</span></code> is an object of type 228 <code class="computeroutput"><span class="identifier">C2</span></code>: 229 </p> 230<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">c1</span> <span class="identifier">is</span> <span class="identifier">convertible</span> <span class="identifier">to</span> <span class="identifier">c2</span><span class="special">)</span> 231 <span class="keyword">return</span> <span class="identifier">C2</span><span class="special">;</span> 232<span class="keyword">else</span> 233 <span class="keyword">return</span> <span class="identifier">C1</span><span class="special">;</span> 234</pre> 235<div class="note"><table border="0" summary="Note"> 236<tr> 237<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> 238<th align="left">Note</th> 239</tr> 240<tr><td align="left" valign="top"><p> 241 The above definition relies on the fact that the more restricting categories 242 and traversal tags are convertible to the less restricting ones. 243 </p></td></tr> 244</table></div> 245<h4> 246<a name="iterator.utilities.traits.h9"></a> 247 <span class="phrase"><a name="iterator.utilities.traits.iterator_category_to_traversal"></a></span><a class="link" href="traits.html#iterator.utilities.traits.iterator_category_to_traversal"><code class="computeroutput"><span class="identifier">iterator_category_to_traversal</span></code></a> 248 </h4> 249<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 250<span class="keyword">struct</span> <span class="identifier">iterator_category_to_traversal</span> 251<span class="special">{</span> 252 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">type</span><span class="special">;</span> 253<span class="special">};</span> 254</pre> 255<p> 256 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">C</span></code> 257 shall be a standard iterator category or an iterator traversal tag. 258 </p> 259<p> 260 If <code class="computeroutput"><span class="identifier">C</span></code> is an iterator traversal 261 tag or convertible to one, <code class="computeroutput"><span class="identifier">type</span></code> 262 equivalent to <code class="computeroutput"><span class="identifier">C</span></code>. Otherwise, 263 <code class="computeroutput"><span class="identifier">type</span></code> is defined to the closest 264 iterator traversal tag matching <code class="computeroutput"><span class="identifier">C</span></code>. 265 </p> 266<h4> 267<a name="iterator.utilities.traits.h10"></a> 268 <span class="phrase"><a name="iterator.utilities.traits.iterator_traversal"></a></span><a class="link" href="traits.html#iterator.utilities.traits.iterator_traversal"><code class="computeroutput"><span class="identifier">iterator_traversal</span></code></a> 269 </h4> 270<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 271<span class="keyword">struct</span> <span class="identifier">iterator_traversal</span> 272<span class="special">{</span> 273 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">iterator_category_to_traversal</span><span class="special"><</span> 274 <span class="keyword">typename</span> <span class="identifier">iterator_category</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">type</span> 275 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span> 276<span class="special">};</span> 277</pre> 278<p> 279 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">Iterator</span></code> 280 shall be an iterator. 281 </p> 282<h4> 283<a name="iterator.utilities.traits.h11"></a> 284 <span class="phrase"><a name="iterator.utilities.traits.pure_traversal_tag"></a></span><a class="link" href="traits.html#iterator.utilities.traits.pure_traversal_tag"><code class="computeroutput"><span class="identifier">pure_traversal_tag</span></code></a> 285 </h4> 286<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 287<span class="keyword">struct</span> <span class="identifier">pure_traversal_tag</span> 288<span class="special">{</span> 289 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">type</span><span class="special">;</span> 290<span class="special">};</span> 291</pre> 292<p> 293 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code> 294 shall be convertible to an iterator traversal tag. 295 </p> 296<p> 297 <code class="computeroutput"><span class="identifier">type</span></code> is defined to be the 298 most advanced traversal tag <code class="computeroutput"><span class="identifier">Tag</span></code> 299 so that <code class="computeroutput"><span class="identifier">T</span></code> is convertible 300 to <code class="computeroutput"><span class="identifier">Tag</span></code>. 301 </p> 302<h4> 303<a name="iterator.utilities.traits.h12"></a> 304 <span class="phrase"><a name="iterator.utilities.traits.pure_iterator_traversal"></a></span><a class="link" href="traits.html#iterator.utilities.traits.pure_iterator_traversal"><code class="computeroutput"><span class="identifier">pure_iterator_traversal</span></code></a> 305 </h4> 306<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 307<span class="keyword">struct</span> <span class="identifier">pure_iterator_traversal</span> 308<span class="special">{</span> 309 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">pure_traversal_tag</span><span class="special"><</span> 310 <span class="keyword">typename</span> <span class="identifier">iterator_traversal</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">type</span> 311 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span> 312<span class="special">};</span> 313</pre> 314<p> 315 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">Iterator</span></code> 316 shall be an iterator. 317 </p> 318</div> 319<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 320<td align="left"></td> 321<td align="right"><div class="copyright-footer">Copyright © 2003, 2005 David Abrahams Jeremy Siek Thomas 322 Witt<p> 323 Distributed under the Boost Software License, Version 1.0. (See accompanying 324 file LICENSE_1_0.txt or copy at <ulink url="http://www.boost.org/LICENSE_1_0.txt"> 325 http://www.boost.org/LICENSE_1_0.txt </ulink>) 326 </p> 327</div></td> 328</tr></table> 329<hr> 330<div class="spirit-nav"> 331<a accesskey="p" href="iterator_traits.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../utilities.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="../algorithms.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 332</div> 333</body> 334</html> 335