• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>pointer_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.Core">
8<link rel="up" href="../index.html" title="Chapter 1. Boost.Core">
9<link rel="prev" href="nvp.html" title="nvp">
10<link rel="next" href="quick_exit.html" title="quick_exit">
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="nvp.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="quick_exit.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="core.pointer_traits"></a><a class="link" href="pointer_traits.html" title="pointer_traits">pointer_traits</a>
28</h2></div></div></div>
29<div class="toc"><dl class="toc">
30<dt><span class="section"><a href="pointer_traits.html#core.pointer_traits.overview">Overview</a></span></dt>
31<dt><span class="section"><a href="pointer_traits.html#core.pointer_traits.examples">Examples</a></span></dt>
32<dt><span class="section"><a href="pointer_traits.html#core.pointer_traits.reference">Reference</a></span></dt>
33<dt><span class="section"><a href="pointer_traits.html#core.pointer_traits.acknowledgments">Acknowledgments</a></span></dt>
34</dl></div>
35<div class="simplesect">
36<div class="titlepage"><div><div><h3 class="title">
37<a name="idm45312826996976"></a>Authors</h3></div></div></div>
38<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
39          Glen Fernandes
40        </li></ul></div>
41</div>
42<div class="section">
43<div class="titlepage"><div><div><h3 class="title">
44<a name="core.pointer_traits.overview"></a><a class="link" href="pointer_traits.html#core.pointer_traits.overview" title="Overview">Overview</a>
45</h3></div></div></div>
46<p>
47        The header &lt;boost/core/pointer_traits.hpp&gt; provides the class template
48        <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">pointer_traits</span></code> to facilitate use of pointer-like
49        types. The C++11 standard library introduced <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pointer_traits</span></code>
50        along with an allocator model which supported pointer-like types in addition
51        to plain raw pointers. This implementation also supports C++98.
52      </p>
53<p>
54        It also provides the function template <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">to_address</span></code>
55        to obtain a raw pointer from an object of any pointer-like type.
56      </p>
57</div>
58<div class="section">
59<div class="titlepage"><div><div><h3 class="title">
60<a name="core.pointer_traits.examples"></a><a class="link" href="pointer_traits.html#core.pointer_traits.examples" title="Examples">Examples</a>
61</h3></div></div></div>
62<p>
63        The following example allocates storage and constructs an object in that
64        storage using an allocator.
65      </p>
66<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
67<span class="keyword">void</span> <span class="identifier">function</span><span class="special">(</span><span class="identifier">Allocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span>
68<span class="special">{</span>
69    <span class="keyword">auto</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
70    <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_traits</span><span class="special">&lt;</span><span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">construct</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">to_address</span><span class="special">(</span><span class="identifier">p</span><span class="special">));</span>
71<span class="special">}</span>
72</pre>
73</div>
74<div class="section">
75<div class="titlepage"><div><div><h3 class="title">
76<a name="core.pointer_traits.reference"></a><a class="link" href="pointer_traits.html#core.pointer_traits.reference" title="Reference">Reference</a>
77</h3></div></div></div>
78<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
79  <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> <span class="keyword">struct</span> <span class="identifier">pointer_traits</span> <span class="special">{</span>
80    <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">pointer</span><span class="special">;</span>
81    <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">element_type</span><span class="special">;</span>
82    <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">difference_type</span><span class="special">;</span>
83
84    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">rebind_to</span> <span class="special">{</span> <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span> <span class="special">};</span>
85    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">rebind</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">rebind_to</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>
86
87    <span class="keyword">static</span> <span class="identifier">pointer</span> <span class="identifier">pointer_to</span><span class="special">(</span><span class="emphasis"><em>see below</em></span> <span class="identifier">v</span><span class="special">);</span>
88  <span class="special">};</span>
89
90  <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> <span class="keyword">struct</span> <span class="identifier">pointer_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;</span> <span class="special">{</span>
91    <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
92    <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">element_type</span><span class="special">;</span>
93    <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span> <span class="identifier">difference_type</span><span class="special">;</span>
94
95    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">rebind_to</span> <span class="special">{</span> <span class="keyword">typedef</span> <span class="identifier">U</span><span class="special">*</span> <span class="identifier">type</span><span class="special">;</span> <span class="special">};</span>
96    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">rebind</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">rebind_to</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>
97
98    <span class="keyword">static</span> <span class="identifier">pointer</span> <span class="identifier">pointer_to</span><span class="special">(</span><span class="emphasis"><em>see below</em></span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
99  <span class="special">};</span>
100
101  <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>
102  <span class="keyword">constexpr</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">to_address</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
103
104  <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>
105  <span class="keyword">auto</span> <span class="identifier">to_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
106<span class="special">}</span>
107</pre>
108<div class="section">
109<div class="titlepage"><div><div><h4 class="title">
110<a name="core.pointer_traits.reference.member_types"></a><a class="link" href="pointer_traits.html#core.pointer_traits.reference.member_types" title="Member types">Member
111        types</a>
112</h4></div></div></div>
113<div class="variablelist">
114<p class="title"><b></b></p>
115<dl class="variablelist">
116<dt><span class="term"><code class="computeroutput"><span class="keyword">typedef</span></code> <span class="emphasis"><em>see
117            below</em></span> <code class="computeroutput"><span class="identifier">element_type</span><span class="special">;</span></code></span></dt>
118<dd><p>
119                <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">element_type</span></code> if such a type exists;
120                otherwise <code class="computeroutput"><span class="identifier">U</span></code> if <code class="computeroutput"><span class="identifier">T</span></code> is a class template instantiation
121                of the form <code class="computeroutput"><span class="identifier">Pointer</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&gt;</span></code>, where <code class="computeroutput"><span class="identifier">Args</span></code>
122                is zero or more type arguments; otherwise the specialization is ill-formed.
123              </p></dd>
124<dt><span class="term"><code class="computeroutput"><span class="keyword">typedef</span></code> <span class="emphasis"><em>see
125            below</em></span> <code class="computeroutput"><span class="identifier">difference_type</span><span class="special">;</span></code></span></dt>
126<dd><p>
127                <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">difference_type</span></code> if such a type
128                exists; otherwise <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span></code>.
129              </p></dd>
130<dt><span class="term"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">struct</span>
131            <span class="identifier">rebind_to</span> <span class="special">{</span>
132            <span class="keyword">typedef</span></code> <span class="emphasis"><em>see below</em></span>
133            <code class="computeroutput"><span class="identifier">type</span><span class="special">;</span>
134            <span class="special">};</span></code></span></dt>
135<dd><p>
136                <code class="computeroutput"><span class="identifier">type</span></code> is <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">rebind</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span></code>
137                if such a type exists; otherwise, <code class="computeroutput"><span class="identifier">Pointer</span><span class="special">&lt;</span><span class="identifier">V</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&gt;</span></code> if <code class="computeroutput"><span class="identifier">T</span></code>
138                is a class template instantiation of the form <code class="computeroutput"><span class="identifier">Pointer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&gt;</span></code>, where <code class="computeroutput"><span class="identifier">Args</span></code>
139                is zero or more type arguments; otherwise, the instantiation of
140                <code class="computeroutput"><span class="identifier">rebind_to</span></code> is ill-formed.
141              </p></dd>
142</dl>
143</div>
144</div>
145<div class="section">
146<div class="titlepage"><div><div><h4 class="title">
147<a name="core.pointer_traits.reference.member_functions"></a><a class="link" href="pointer_traits.html#core.pointer_traits.reference.member_functions" title="Member functions">Member
148        functions</a>
149</h4></div></div></div>
150<div class="variablelist">
151<p class="title"><b></b></p>
152<dl class="variablelist">
153<dt><span class="term"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">pointer</span>
154            <span class="identifier">pointer_traits</span><span class="special">::</span><span class="identifier">pointer_to</span><span class="special">(</span></code><span class="emphasis"><em>see
155            below</em></span> <code class="computeroutput"><span class="identifier">v</span><span class="special">);</span></code></span></dt>
156<dd><div class="variablelist">
157<p class="title"><b></b></p>
158<dl class="variablelist">
159<dt><span class="term">Remark</span></dt>
160<dd><p>
161                      If <code class="computeroutput"><span class="identifier">element_type</span></code>
162                      is a void type, the type of <code class="computeroutput"><span class="identifier">v</span></code>
163                      is unspecified; otherwise, it is <code class="computeroutput"><span class="identifier">element_type</span><span class="special">&amp;</span></code>.
164                    </p></dd>
165<dt><span class="term">Returns</span></dt>
166<dd><p>
167                      A pointer to <code class="computeroutput"><span class="identifier">v</span></code>
168                      obtained by calling <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">pointer_to</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>.
169                    </p></dd>
170</dl>
171</div></dd>
172<dt><span class="term"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">pointer</span>
173            <span class="identifier">pointer_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;::</span><span class="identifier">pointer_to</span><span class="special">(</span></code><span class="emphasis"><em>see
174            below</em></span> <code class="computeroutput"><span class="identifier">v</span><span class="special">)</span>
175            <span class="keyword">noexcept</span><span class="special">;</span></code></span></dt>
176<dd><div class="variablelist">
177<p class="title"><b></b></p>
178<dl class="variablelist">
179<dt><span class="term">Remark</span></dt>
180<dd><p>
181                      If <code class="computeroutput"><span class="identifier">element_type</span></code>
182                      is a void type, the type of <code class="computeroutput"><span class="identifier">v</span></code>
183                      is unspecified; otherwise, it is <code class="computeroutput"><span class="identifier">element_type</span><span class="special">&amp;</span></code>.
184                    </p></dd>
185<dt><span class="term">Returns</span></dt>
186<dd><p>
187                      <code class="computeroutput"><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>.
188                    </p></dd>
189</dl>
190</div></dd>
191</dl>
192</div>
193</div>
194<div class="section">
195<div class="titlepage"><div><div><h4 class="title">
196<a name="core.pointer_traits.reference.optional_members"></a><a class="link" href="pointer_traits.html#core.pointer_traits.reference.optional_members" title="Optional members">Optional
197        members</a>
198</h4></div></div></div>
199<div class="variablelist">
200<p class="title"><b></b></p>
201<dl class="variablelist">
202<dt><span class="term"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">element_type</span><span class="special">*</span> <span class="identifier">to_address</span><span class="special">(</span><span class="identifier">pointer</span>
203            <span class="identifier">v</span><span class="special">)</span>
204            <span class="keyword">noexcept</span><span class="special">;</span></code></span></dt>
205<dd><div class="variablelist">
206<p class="title"><b></b></p>
207<dl class="variablelist">
208<dt><span class="term">Returns</span></dt>
209<dd><p>
210                      A pointer of type <code class="computeroutput"><span class="identifier">element_type</span><span class="special">*</span></code> that references the same location
211                      as the argument <code class="computeroutput"><span class="identifier">p</span></code>.
212                    </p></dd>
213<dt><span class="term">Note</span></dt>
214<dd><p>
215                      This function should be the inverse of <code class="computeroutput"><span class="identifier">pointer_to</span></code>.
216                      If defined, it customizes the behavior of the non-member function
217                      <code class="computeroutput"><span class="identifier">to_address</span></code>.
218                    </p></dd>
219</dl>
220</div></dd>
221</dl>
222</div>
223</div>
224<div class="section">
225<div class="titlepage"><div><div><h4 class="title">
226<a name="core.pointer_traits.reference.free_functions"></a><a class="link" href="pointer_traits.html#core.pointer_traits.reference.free_functions" title="Free functions">Free
227        functions</a>
228</h4></div></div></div>
229<div class="variablelist">
230<p class="title"><b></b></p>
231<dl class="variablelist">
232<dt><span class="term"><code class="computeroutput"><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> <span class="keyword">constexpr</span>
233            <span class="identifier">T</span><span class="special">*</span>
234            <span class="identifier">to_address</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code></span></dt>
235<dd><div class="variablelist">
236<p class="title"><b></b></p>
237<dl class="variablelist">
238<dt><span class="term">Returns</span></dt>
239<dd><p>
240                      <code class="computeroutput"><span class="identifier">v</span></code>.
241                    </p></dd>
242</dl>
243</div></dd>
244<dt><span class="term"><code class="computeroutput"><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> <span class="keyword">auto</span> <span class="identifier">to_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code></span></dt>
245<dd><div class="variablelist">
246<p class="title"><b></b></p>
247<dl class="variablelist">
248<dt><span class="term">Returns</span></dt>
249<dd><p>
250                      <code class="computeroutput"><span class="identifier">pointer_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">to_address</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code> if that expression is well-formed,
251                      otherwise <code class="computeroutput"><span class="identifier">to_address</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="keyword">operator</span><span class="special">-&gt;())</span></code>.
252                    </p></dd>
253</dl>
254</div></dd>
255</dl>
256</div>
257</div>
258</div>
259<div class="section">
260<div class="titlepage"><div><div><h3 class="title">
261<a name="core.pointer_traits.acknowledgments"></a><a class="link" href="pointer_traits.html#core.pointer_traits.acknowledgments" title="Acknowledgments">Acknowledgments</a>
262</h3></div></div></div>
263<p>
264        Glen Fernandes implemented <code class="computeroutput"><span class="identifier">pointer_traits</span></code>
265        and <code class="computeroutput"><span class="identifier">to_address</span></code> with reviews
266        and guidance from Peter Dimov.
267      </p>
268</div>
269</div>
270<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
271<td align="left"></td>
272<td align="right"><div class="copyright-footer">Copyright © 2014 Peter Dimov<br>Copyright © 2014 Glen Fernandes<br>Copyright © 2014 Andrey Semashev<p>
273        Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
274        Software License, Version 1.0</a>.
275      </p>
276</div></td>
277</tr></table>
278<hr>
279<div class="spirit-nav">
280<a accesskey="p" href="nvp.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="quick_exit.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
281</div>
282</body>
283</html>
284