• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
7 <title>pointee and indirect_reference</title>
8 <meta name="author" content="David Abrahams" />
9 <meta name="organization" content="Boost Consulting" />
10 <meta name="date" content="2006-09-11" />
11 <meta name="copyright" content="Copyright David Abrahams 2004." />
12 <link rel="stylesheet" href="../../../rst.css" type="text/css" />
13 </head>
14 <body>
15 <div class="document" id="pointee-and-indirect-reference">
16 <h1 class="title"><tt class="docutils literal"><span class="pre">pointee</span></tt> and <tt class="docutils literal"><span class="pre">indirect_reference</span></tt></h1>
17 <table class="docinfo" frame="void" rules="none">
18 <col class="docinfo-name" />
19 <col class="docinfo-content" />
20 <tbody valign="top">
21 <tr><th class="docinfo-name">Author:</th>
22 <td>David Abrahams</td></tr>
23 <tr><th class="docinfo-name">Contact:</th>
24 <td><a class="first last reference external" href="mailto:dave&#64;boost-consulting.com">dave&#64;boost-consulting.com</a></td></tr>
25 <tr><th class="docinfo-name">Organization:</th>
26 <td><a class="first last reference external" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
27 <tr><th class="docinfo-name">Date:</th>
28 <td>2006-09-11</td></tr>
29 <tr><th class="docinfo-name">Copyright:</th>
30 <td>Copyright David Abrahams 2004.</td></tr>
31 </tbody>
32 </table>
33 <!-- Distributed under the Boost -->
34 <!-- Software License, Version 1.0. (See accompanying -->
35 <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
36 <table class="docutils field-list" frame="void" rules="none">
37 <col class="field-name" />
38 <col class="field-body" />
39 <tbody valign="top">
40 <tr class="field"><th class="field-name">abstract:</th><td class="field-body">Provides the capability to deduce the referent types of
41 pointers, smart pointers and iterators in generic code.</td>
42 </tr>
43 </tbody>
44 </table>
45 <div class="section" id="overview">
46 <h1>Overview</h1>
47 <p>Have you ever wanted to write a generic function that can operate
48 on any kind of dereferenceable object?  If you have, you've
49 probably run into the problem of how to determine the type that the
50 object &quot;points at&quot;:</p>
51 <pre class="literal-block">
52 template &lt;class Dereferenceable&gt;
53 void f(Dereferenceable p)
54 {
55     <em>what-goes-here?</em> value = *p;
56     ...
57 }
58 </pre>
59 <div class="section" id="pointee">
60 <h2><tt class="docutils literal"><span class="pre">pointee</span></tt></h2>
61 <p>It turns out to be impossible to come up with a fully-general
62 algorithm to do determine <em>what-goes-here</em> directly, but it is
63 possible to require that <tt class="docutils literal"><span class="pre">pointee&lt;Dereferenceable&gt;::type</span></tt> is
64 correct. Naturally, <tt class="docutils literal"><span class="pre">pointee</span></tt> has the same difficulty: it can't
65 determine the appropriate <tt class="docutils literal"><span class="pre">::type</span></tt> reliably for all
66 <tt class="docutils literal"><span class="pre">Dereferenceable</span></tt>s, but it makes very good guesses (it works
67 for all pointers, standard and boost smart pointers, and
68 iterators), and when it guesses wrongly, it can be specialized as
69 necessary:</p>
70 <pre class="literal-block">
71 namespace boost
72 {
73   template &lt;class T&gt;
74   struct pointee&lt;third_party_lib::smart_pointer&lt;T&gt; &gt;
75   {
76       typedef T type;
77   };
78 }
79 </pre>
80 </div>
81 <div class="section" id="indirect-reference">
82 <h2><tt class="docutils literal"><span class="pre">indirect_reference</span></tt></h2>
83 <p><tt class="docutils literal"><span class="pre">indirect_reference&lt;T&gt;::type</span></tt> is rather more specialized than
84 <tt class="docutils literal"><span class="pre">pointee</span></tt>, and is meant to be used to forward the result of
85 dereferencing an object of its argument type.  Most dereferenceable
86 types just return a reference to their pointee, but some return
87 proxy references or return the pointee by value.  When that
88 information is needed, call on <tt class="docutils literal"><span class="pre">indirect_reference</span></tt>.</p>
89 <p>Both of these templates are essential to the correct functioning of
90 <a class="reference external" href="indirect_iterator.html"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt></a>.</p>
91 </div>
92 </div>
93 <div class="section" id="reference">
94 <h1>Reference</h1>
95 <div class="section" id="id1">
96 <h2><tt class="docutils literal"><span class="pre">pointee</span></tt></h2>
97 <!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
98 <!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
99 <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
100 <pre class="literal-block">
101 template &lt;class Dereferenceable&gt;
102 struct pointee
103 {
104     typedef /* see below */ type;
105 };
106 </pre>
107 <table class="docutils field-list" frame="void" rules="none">
108 <col class="field-name" />
109 <col class="field-body" />
110 <tbody valign="top">
111 <tr class="field"><th class="field-name">Requires:</th><td class="field-body">For an object <tt class="docutils literal"><span class="pre">x</span></tt> of type <tt class="docutils literal"><span class="pre">Dereferenceable</span></tt>, <tt class="docutils literal"><span class="pre">*x</span></tt>
112 is well-formed.  If <tt class="docutils literal"><span class="pre">++x</span></tt> is ill-formed it shall neither be
113 ambiguous nor shall it violate access control, and
114 <tt class="docutils literal"><span class="pre">Dereferenceable::element_type</span></tt> shall be an accessible type.
115 Otherwise <tt class="docutils literal"><span class="pre">iterator_traits&lt;Dereferenceable&gt;::value_type</span></tt> shall
116 be well formed.  [Note: These requirements need not apply to
117 explicit or partial specializations of <tt class="docutils literal"><span class="pre">pointee</span></tt>]</td>
118 </tr>
119 </tbody>
120 </table>
121 <p><tt class="docutils literal"><span class="pre">type</span></tt> is determined according to the following algorithm, where
122 <tt class="docutils literal"><span class="pre">x</span></tt> is an object of type <tt class="docutils literal"><span class="pre">Dereferenceable</span></tt>:</p>
123 <pre class="literal-block">
124 if ( ++x is ill-formed )
125 {
126     return ``Dereferenceable::element_type``
127 }
128 else if (``*x`` is a mutable reference to
129          std::iterator_traits&lt;Dereferenceable&gt;::value_type)
130 {
131     return iterator_traits&lt;Dereferenceable&gt;::value_type
132 }
133 else
134 {
135     return iterator_traits&lt;Dereferenceable&gt;::value_type const
136 }
137 </pre>
138 </div>
139 <div class="section" id="id2">
140 <h2><tt class="docutils literal"><span class="pre">indirect_reference</span></tt></h2>
141 <!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
142 <!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
143 <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
144 <pre class="literal-block">
145 template &lt;class Dereferenceable&gt;
146 struct indirect_reference
147 {
148     typedef /* see below */ type;
149 };
150 </pre>
151 <table class="docutils field-list" frame="void" rules="none">
152 <col class="field-name" />
153 <col class="field-body" />
154 <tbody valign="top">
155 <tr class="field"><th class="field-name">Requires:</th><td class="field-body">For an object <tt class="docutils literal"><span class="pre">x</span></tt> of type <tt class="docutils literal"><span class="pre">Dereferenceable</span></tt>, <tt class="docutils literal"><span class="pre">*x</span></tt>
156 is well-formed.  If <tt class="docutils literal"><span class="pre">++x</span></tt> is ill-formed it shall neither be
157 ambiguous nor shall it violate access control, and
158 <tt class="docutils literal"><span class="pre">pointee&lt;Dereferenceable&gt;::type&amp;</span></tt> shall be well-formed.
159 Otherwise <tt class="docutils literal"><span class="pre">iterator_traits&lt;Dereferenceable&gt;::reference</span></tt> shall
160 be well formed.  [Note: These requirements need not apply to
161 explicit or partial specializations of <tt class="docutils literal"><span class="pre">indirect_reference</span></tt>]</td>
162 </tr>
163 </tbody>
164 </table>
165 <p><tt class="docutils literal"><span class="pre">type</span></tt> is determined according to the following algorithm, where
166 <tt class="docutils literal"><span class="pre">x</span></tt> is an object of type <tt class="docutils literal"><span class="pre">Dereferenceable</span></tt>:</p>
167 <pre class="literal-block">
168 if ( ++x is ill-formed )
169     return ``pointee&lt;Dereferenceable&gt;::type&amp;``
170 else
171     std::iterator_traits&lt;Dereferenceable&gt;::reference
172 </pre>
173 </div>
174 </div>
175 </div>
176 <div class="footer">
177 <hr class="footer" />
178 <a class="reference external" href="pointee.rst">View document source</a>.
179 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
180 
181 </div>
182 </body>
183 </html>
184