• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">&gt;</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
63  <span class="keyword">struct</span> <span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">third_party_lib</span><span class="special">::</span><span class="identifier">smart_pointer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&lt;</span>
94        <span class="identifier">minimum_category</span><span class="special">&lt;</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">&gt;::</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">&gt;::</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">&lt;</span><span class="identifier">C</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span></code> - a shorthand for <code class="computeroutput"><span class="identifier">iterator_category_to_traversal</span><span class="special">&lt;</span><span class="identifier">iterator_category</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
130            - a shorthand for <code class="computeroutput"><span class="identifier">pure_traversal_tag</span><span class="special">&lt;</span><span class="identifier">iterator_traversal</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</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">&lt;</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">&gt;</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="keyword">class</span> <span class="identifier">Dereferenceable</span><span class="special">&gt;</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&amp;</span></code>
194        shall be well-formed. Otherwise <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Dereferenceable</span><span class="special">&gt;::</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</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">&lt;</span>
274        <span class="keyword">typename</span> <span class="identifier">iterator_category</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">type</span>
275    <span class="special">&gt;::</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</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">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</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">&lt;</span>
310        <span class="keyword">typename</span> <span class="identifier">iterator_traversal</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">type</span>
311    <span class="special">&gt;::</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 &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
325        http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
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