• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Reference</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../typeof.html" title="Chapter 42. Boost.Typeof">
10<link rel="prev" href="tuto.html" title="Tutorial">
11<link rel="next" href="other.html" title="Other considerations and tips">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="tuto.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../typeof.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="other.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="typeof.refe"></a>Reference</h2></div></div></div>
29<div class="toc"><dl class="toc">
30<dt><span class="section"><a href="refe.html#typeof.auto">AUTO, AUTO_TPL</a></span></dt>
31<dt><span class="section"><a href="refe.html#typeof.compl">COMPLIANT</a></span></dt>
32<dt><span class="section"><a href="refe.html#typeof.incr">INCREMENT_REGISTRATION_GROUP</a></span></dt>
33<dt><span class="section"><a href="refe.html#typeof.inte">INTEGRAL</a></span></dt>
34<dt><span class="section"><a href="refe.html#typeof.limit_func">LIMIT_FUNCTION_ARITY</a></span></dt>
35<dt><span class="section"><a href="refe.html#typeof.messages">MESSAGES</a></span></dt>
36<dt><span class="section"><a href="refe.html#typeof.limit_size">LIMIT_SIZE</a></span></dt>
37<dt><span class="section"><a href="refe.html#typeof.regtype">REGISTER_TYPE</a></span></dt>
38<dt><span class="section"><a href="refe.html#typeof.regtemp">REGISTER_TEMPLATE</a></span></dt>
39<dt><span class="section"><a href="refe.html#typeof.temp">TEMPLATE</a></span></dt>
40<dt><span class="section"><a href="refe.html#typeof.typo">TYPEOF, TYPEOF_TPL</a></span></dt>
41<dt><span class="section"><a href="refe.html#typeof.typn">TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL</a></span></dt>
42</dl></div>
43<div class="section">
44<div class="titlepage"><div><div><h3 class="title">
45<a name="typeof.auto"></a>AUTO, AUTO_TPL</h3></div></div></div>
46<p>
47        The <code class="computeroutput"><span class="identifier">BOOST_AUTO</span></code> macro emulates
48        the proposed <code class="computeroutput"><span class="keyword">auto</span></code> keyword in
49        C++.
50      </p>
51<h5>
52<a name="auto.usage"></a>
53        Usage
54      </h5>
55<pre class="programlisting"><span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">var</span><span class="special">,</span><span class="identifier">expr</span><span class="special">)</span>
56<span class="identifier">BOOST_AUTO_TPL</span><span class="special">(</span><span class="identifier">var</span><span class="special">,</span><span class="identifier">expr</span><span class="special">)</span>
57</pre>
58<div class="variablelist">
59<p class="title"><b>Arguments</b></p>
60<dl class="variablelist">
61<dt><span class="term">var</span></dt>
62<dd><p>
63              a variable to be initialized with the expression
64            </p></dd>
65<dt><span class="term">expr</span></dt>
66<dd><p>
67              a valid c++ expression
68            </p></dd>
69</dl>
70</div>
71<h5>
72<a name="auto.remarks"></a>
73        Remarks
74      </h5>
75<p>
76        If you want to use <code class="computeroutput"><span class="keyword">auto</span></code> in a
77        template-context, use <code class="computeroutput"><span class="identifier">BOOST_AUTO_TPL</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span></code>,
78        which takes care of the <code class="computeroutput"><span class="keyword">typename</span></code>
79        keyword inside the <code class="computeroutput"><span class="keyword">auto</span></code> expression.
80      </p>
81<h5>
82<a name="auto.sample_code"></a>
83        Sample Code
84      </h5>
85<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
86<span class="special">{</span>
87    <span class="identifier">length</span><span class="special">::</span><span class="identifier">meter</span> <span class="identifier">a</span><span class="special">(</span><span class="number">5</span><span class="special">);</span>
88    <span class="identifier">force</span><span class="special">::</span><span class="identifier">newton</span> <span class="identifier">b</span><span class="special">(</span><span class="number">6</span><span class="special">);</span>
89    <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> <span class="identifier">a</span> <span class="special">*</span> <span class="identifier">b</span><span class="special">);</span>
90<span class="special">}</span>
91</pre>
92</div>
93<div class="section">
94<div class="titlepage"><div><div><h3 class="title">
95<a name="typeof.compl"></a>COMPLIANT</h3></div></div></div>
96<p>
97        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_COMPLIANT</span></code>
98        macro can be used to force the emulation mode. Define it if your compiler
99        by default uses another mode, such as native <code class="computeroutput"><span class="identifier">typeof</span></code>
100        or Microsoft-specific trick, but you want to use the emulation mode, for
101        example for portability reasons.
102      </p>
103</div>
104<div class="section">
105<div class="titlepage"><div><div><h3 class="title">
106<a name="typeof.incr"></a>INCREMENT_REGISTRATION_GROUP</h3></div></div></div>
107<p>
108        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span></code>
109        macro ensures that type registrations in different header files receive unique
110        identifiers.
111      </p>
112<h5>
113<a name="incr.usage"></a>
114        Usage
115      </h5>
116<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
117</pre>
118<h5>
119<a name="incr.remarks"></a>
120        Remarks
121      </h5>
122<p>
123        specified once in every cpp/hpp file where any registration is performed,
124        before any registration.
125      </p>
126<h5>
127<a name="incr.sample_code"></a>
128        Sample Code
129      </h5>
130<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
131
132<span class="keyword">class</span> <span class="identifier">X</span><span class="special">;</span>
133<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span>
134</pre>
135</div>
136<div class="section">
137<div class="titlepage"><div><div><h3 class="title">
138<a name="typeof.inte"></a>INTEGRAL</h3></div></div></div>
139<p>
140        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span></code>
141        macro is used when registering an integral template parameter using <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>.
142      </p>
143<p>
144        Useful for <code class="computeroutput"><span class="keyword">enum</span></code>s and dependent
145        integral template parameters.
146      </p>
147<h5>
148<a name="inte.usage"></a>
149        Usage
150      </h5>
151<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
152</pre>
153<div class="variablelist">
154<p class="title"><b>Arguments</b></p>
155<dl class="variablelist">
156<dt><span class="term">x</span></dt>
157<dd><p>
158              a fully qualified integral type or enum
159            </p></dd>
160</dl>
161</div>
162<h5>
163<a name="inte.remarks"></a>
164        Remarks
165      </h5>
166<p>
167        A short syntax has been implemented for the built in types (int, bool, long,
168        unsigned long, etc.) Other non-type template parameters (e.g. pointer to
169        member) are not supported.
170      </p>
171<h5>
172<a name="inte.sample_code"></a>
173        Sample Code
174      </h5>
175<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
176
177<span class="keyword">namespace</span> <span class="identifier">foo</span>
178<span class="special">{</span>
179    <span class="keyword">enum</span> <span class="identifier">color</span> <span class="special">{</span><span class="identifier">red</span><span class="special">,</span> <span class="identifier">green</span><span class="special">,</span> <span class="identifier">blue</span><span class="special">};</span>
180
181    <span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">color</span> <span class="identifier">C0</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">&gt;</span>
182    <span class="keyword">class</span> <span class="identifier">class_with_enum</span> <span class="special">{};</span>
183
184    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span><span class="identifier">T0</span> <span class="identifier">I1</span><span class="special">&gt;</span>
185    <span class="keyword">class</span> <span class="identifier">class_with_dependent_non_type</span> <span class="special">{};</span>
186<span class="special">}</span>
187
188<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">class_with_enum</span><span class="special">,</span>
189    <span class="special">(</span><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">color</span><span class="special">))</span>
190    <span class="special">(</span><span class="keyword">typename</span><span class="special">)</span>
191    <span class="special">)</span>
192
193<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">class_with_dependent_non_type</span><span class="special">,</span>
194    <span class="special">(</span><span class="keyword">typename</span><span class="special">)</span>
195    <span class="special">(</span><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">P0</span><span class="special">))</span>
196    <span class="special">)</span>
197</pre>
198</div>
199<div class="section">
200<div class="titlepage"><div><div><h3 class="title">
201<a name="typeof.limit_func"></a>LIMIT_FUNCTION_ARITY</h3></div></div></div>
202<p>
203        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_FUNCTION_ARITY</span></code>
204        macro defines how many parameters are supported for functios, and applies
205        to functions, function pointers, function references, and member function
206        pointers. The default value is 10. Redefine if you want the Typeof Library
207        to handle functions with more parameters.
208      </p>
209</div>
210<div class="section">
211<div class="titlepage"><div><div><h3 class="title">
212<a name="typeof.messages"></a>MESSAGES</h3></div></div></div>
213<p>
214        Define <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_MESSAGE</span></code>
215        before including boost/typeof/typeof.hpp to include messages "using
216        typeof emulation" and "using native typeof". By default, these
217        messages will not be displayed.
218      </p>
219</div>
220<div class="section">
221<div class="titlepage"><div><div><h3 class="title">
222<a name="typeof.limit_size"></a>LIMIT_SIZE</h3></div></div></div>
223<p>
224        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_SIZE</span></code>
225        macro defines the size of the compile-time sequence used to encode a type.
226        The default value is 50. Increase it if you want the Typeof Library to handle
227        very complex types, although this possibility is limited by the maximum number
228        of template parameters supported by your compiler. On the other hand, if
229        you work only with very simple types, decreasing this number may help to
230        boost compile-time performance.
231      </p>
232</div>
233<div class="section">
234<div class="titlepage"><div><div><h3 class="title">
235<a name="typeof.regtype"></a>REGISTER_TYPE</h3></div></div></div>
236<p>
237        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span></code>
238        macro informs the Typeof Library about the existence of a type
239      </p>
240<h5>
241<a name="regtype.usage"></a>
242        Usage
243      </h5>
244<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
245</pre>
246<div class="variablelist">
247<p class="title"><b>Arguments</b></p>
248<dl class="variablelist">
249<dt><span class="term">x</span></dt>
250<dd><p>
251              a fully qualified type
252            </p></dd>
253</dl>
254</div>
255<h5>
256<a name="regtype.remarks"></a>
257        Remarks
258      </h5>
259<p>
260        Must be used in the global namespace
261      </p>
262<h5>
263<a name="regtype.sample_code"></a>
264        Sample Code
265      </h5>
266<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
267
268<span class="keyword">namespace</span> <span class="identifier">foo</span>
269<span class="special">{</span>
270    <span class="keyword">class</span> <span class="identifier">bar</span> <span class="special">{};</span>
271    <span class="keyword">enum</span> <span class="identifier">color</span> <span class="special">{</span><span class="identifier">red</span><span class="special">,</span> <span class="identifier">green</span><span class="special">,</span> <span class="identifier">blue</span><span class="special">};</span>
272<span class="special">}</span>
273
274<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">bar</span><span class="special">)</span>
275<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">color</span><span class="special">)</span>
276</pre>
277</div>
278<div class="section">
279<div class="titlepage"><div><div><h3 class="title">
280<a name="typeof.regtemp"></a>REGISTER_TEMPLATE</h3></div></div></div>
281<p>
282        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>
283        macro informs the Typeof Library about the existence of a template and describes
284        its parameters
285      </p>
286<h5>
287<a name="regtemp.usage"></a>
288        Usage
289      </h5>
290<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span>
291<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">seq</span><span class="special">)</span>
292</pre>
293<div class="variablelist">
294<p class="title"><b>Arguments</b></p>
295<dl class="variablelist">
296<dt><span class="term">x</span></dt>
297<dd><p>
298              a fully qualified template
299            </p></dd>
300<dt><span class="term">n</span></dt>
301<dd><p>
302              the number of template arguments. Only valid if all template arguments
303              are typenames
304            </p></dd>
305<dt><span class="term">seq</span></dt>
306<dd><p>
307              a sequence of template arguments. Must be used when integral or template
308              template parameters are present
309            </p></dd>
310</dl>
311</div>
312<h5>
313<a name="regtemp.remarks"></a>
314        Remarks
315      </h5>
316<p>
317        Must be used in the global namespace.
318      </p>
319<p>
320        The library allows registration of templates with type, integral, and template
321        template parameters:
322      </p>
323<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
324<li class="listitem">
325            A type template parameter is described by the <code class="computeroutput"><span class="special">(</span><span class="keyword">class</span><span class="special">)</span></code>
326            or <code class="computeroutput"><span class="special">(</span><span class="keyword">typename</span><span class="special">)</span></code> sequence element
327          </li>
328<li class="listitem">
329            A template parameter of a well-known integral type can be described by
330            simply supplying its type, like <code class="computeroutput"><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code>. The following well-known integral types
331            are supported:
332            <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
333<li class="listitem">
334                  <code class="computeroutput"><span class="special">[</span><span class="keyword">signed</span><span class="special">/</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">char</span></code>
335                </li>
336<li class="listitem">
337                  <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">short</span></code>
338                </li>
339<li class="listitem">
340                  <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">int</span></code>
341                </li>
342<li class="listitem">
343                  <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">long</span></code>
344                </li>
345<li class="listitem">
346                  <code class="computeroutput"><span class="keyword">unsigned</span></code>
347                </li>
348<li class="listitem">
349                  <code class="computeroutput"><span class="keyword">bool</span></code>
350                </li>
351<li class="listitem">
352                  <code class="computeroutput"><span class="identifier">size_t</span></code>
353                </li>
354</ul></div>
355          </li>
356<li class="listitem">
357            Enums and typedefs of integral types, need to be described explicitly
358            with the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span></code>
359            macro, like <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">MyEnum</span><span class="special">))</span></code>
360          </li>
361<li class="listitem">
362            Template template parameters are described with the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span></code>
363            macro, like: <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">((</span><span class="keyword">class</span><span class="special">)(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)))</span></code>.
364            In case of all type parameters this can be shortened to something like
365            <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="number">2</span><span class="special">))</span></code>.
366            The nested template template parameters are not supported.
367          </li>
368</ul></div>
369<h5>
370<a name="regtemp.sample_code"></a>
371        Sample Code
372      </h5>
373<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
374
375<span class="keyword">namespace</span> <span class="identifier">foo</span>
376<span class="special">{</span>
377    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">&gt;</span>
378    <span class="keyword">class</span> <span class="identifier">simple_template</span> <span class="special">{};</span>
379
380    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">I1</span><span class="special">&gt;</span>
381    <span class="keyword">class</span> <span class="identifier">class_with_integral_constant</span> <span class="special">{};</span>
382<span class="special">}</span>
383
384<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">simple_template</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span>
385<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">class_with_integral_constant</span><span class="special">,</span> <span class="special">(</span><span class="keyword">typename</span><span class="special">)(</span><span class="keyword">int</span><span class="special">))</span>
386</pre>
387</div>
388<div class="section">
389<div class="titlepage"><div><div><h3 class="title">
390<a name="typeof.temp"></a>TEMPLATE</h3></div></div></div>
391<p>
392        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span></code>
393        macro is used when registering template template parameters using <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>.
394      </p>
395<h5>
396<a name="temp.usage"></a>
397        Usage
398      </h5>
399<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span>
400<span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="identifier">seq</span><span class="special">)</span>
401</pre>
402<div class="variablelist">
403<p class="title"><b>Arguments</b></p>
404<dl class="variablelist">
405<dt><span class="term">n</span></dt>
406<dd><p>
407              the number of template arguments. Only valid if all template arguments
408              are typenames
409            </p></dd>
410<dt><span class="term">seq</span></dt>
411<dd><p>
412              a sequence of template arguments. Must be used when there are integral
413              constants in the nested template
414            </p></dd>
415</dl>
416</div>
417<h5>
418<a name="temp.remarks"></a>
419        Remarks
420      </h5>
421<p>
422        Can not be used to register nested template template parameters.
423      </p>
424<h5>
425<a name="temp.sample_code"></a>
426        Sample Code
427      </h5>
428<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
429
430<span class="keyword">namespace</span> <span class="identifier">foo</span>
431<span class="special">{</span>
432    <span class="keyword">enum</span> <span class="identifier">color</span> <span class="special">{</span><span class="identifier">red</span><span class="special">,</span> <span class="identifier">green</span><span class="special">,</span> <span class="identifier">blue</span><span class="special">};</span>
433
434    <span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">color</span> <span class="identifier">C0</span><span class="special">,</span> <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">T1</span><span class="special">&gt;</span>
435    <span class="keyword">class</span> <span class="identifier">nested_template_class</span> <span class="special">{};</span>
436
437    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">T1</span><span class="special">&gt;</span>
438    <span class="keyword">class</span> <span class="identifier">nested_with_integral</span> <span class="special">{};</span>
439<span class="special">}</span>
440
441<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">nested_template_class</span><span class="special">,</span>
442    <span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">color</span><span class="special">)</span>
443    <span class="special">(</span><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="number">1</span><span class="special">))</span>
444    <span class="special">)</span>
445
446<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">nested_with_integral</span><span class="special">,</span>
447    <span class="special">(</span><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">((</span><span class="keyword">typename</span><span class="special">)(</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">)))</span>
448    <span class="special">)</span>
449</pre>
450</div>
451<div class="section">
452<div class="titlepage"><div><div><h3 class="title">
453<a name="typeof.typo"></a>TYPEOF, TYPEOF_TPL</h3></div></div></div>
454<p>
455        The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code> macro calculates
456        the type of an expression, but removes the top-level qualifiers, <code class="computeroutput"><span class="keyword">const</span><span class="special">&amp;</span></code>
457      </p>
458<h5>
459<a name="typo.usage"></a>
460        Usage
461      </h5>
462<pre class="programlisting"><span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span>
463<span class="identifier">BOOST_TYPEOF_TPL</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span>
464</pre>
465<div class="variablelist">
466<p class="title"><b>Arguments</b></p>
467<dl class="variablelist">
468<dt><span class="term">expr</span></dt>
469<dd><p>
470              a valid c++ expression that can be bound to const T&amp;
471            </p></dd>
472</dl>
473</div>
474<h5>
475<a name="typo.remarks"></a>
476        Remarks
477      </h5>
478<p>
479        If you want to use <code class="computeroutput"><span class="identifier">typeof</span></code>
480        in a template-context, use <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TPL</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span></code>,
481        which takes care of <code class="computeroutput"><span class="keyword">typename</span></code>
482        inside the <code class="computeroutput"><span class="identifier">typeof</span></code> expression.
483      </p>
484<h5>
485<a name="typo.sample_code"></a>
486        Sample Code
487      </h5>
488<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">B</span><span class="special">&gt;</span>
489<span class="keyword">struct</span> <span class="identifier">result_of_conditional</span>
490<span class="special">{</span>
491    <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF_TPL</span><span class="special">(</span><span class="keyword">true</span><span class="special">?</span><span class="identifier">A</span><span class="special">():</span><span class="identifier">B</span><span class="special">())</span> <span class="identifier">type</span><span class="special">;</span>
492<span class="special">};</span>
493
494<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">B</span><span class="special">&gt;</span>
495<span class="identifier">result_of_conditional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">min</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span>
496<span class="special">{</span>
497    <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">&lt;</span> <span class="identifier">b</span> <span class="special">?</span> <span class="identifier">a</span> <span class="special">:</span> <span class="identifier">b</span><span class="special">;</span>
498<span class="special">}</span>
499</pre>
500</div>
501<div class="section">
502<div class="titlepage"><div><div><h3 class="title">
503<a name="typeof.typn"></a>TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL</h3></div></div></div>
504<p>
505        The <code class="computeroutput"><span class="identifier">TYPEOF_NESTED_TYPEDEF</span></code>
506        macro works in much the same way as the 'TYPEOF' macro does, but workarounds
507        several compiler deficiencies.
508      </p>
509<h5>
510<a name="typn.usage"></a>
511        Usage
512      </h5>
513<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_NESTED_TYPEDEF</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span><span class="identifier">expr</span><span class="special">)</span>
514<span class="identifier">BOOST_TYPEOF_NESTED_TYPEDEF_TPL</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span><span class="identifier">expr</span><span class="special">)</span>
515</pre>
516<div class="variablelist">
517<p class="title"><b>Arguments</b></p>
518<dl class="variablelist">
519<dt><span class="term">name</span></dt>
520<dd>
521<p>
522              a valid identifier to nest the typeof operation inside
523            </p>
524<p>
525              expr
526            </p>
527<p>
528              a valid c++ expression that can be bound to const T&amp;
529            </p>
530</dd>
531</dl>
532</div>
533<h5>
534<a name="typn.remarks"></a>
535        Remarks
536      </h5>
537<p>
538        'typeof_nested_typedef' nests the 'typeof' operation inside a struct. By
539        doing this, the 'typeof' operation can be split into two steps, deconfusing
540        several compilers (notably VC7.1 and VC8.0) on the way. This also removes
541        the limitation imposed by <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_SIZE</span></code>
542        and allows you to use 'typeof' on much larger expressions.
543      </p>
544<p>
545        If you want to use <code class="computeroutput"><span class="identifier">typeof_nested_typedef</span></code>
546        in a template-context, use <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_NESTED_TYPEDEF_TPL</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span><span class="identifier">expr</span><span class="special">)</span></code>,
547        which takes care of <code class="computeroutput"><span class="keyword">typename</span></code>
548        inside the <code class="computeroutput"><span class="identifier">typeof</span></code> expression.
549      </p>
550<p>
551        'typeof_nested_typedef' can not be used at function/block scope.
552      </p>
553<h5>
554<a name="typn.sample_code"></a>
555        Sample Code
556      </h5>
557<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">B</span><span class="special">&gt;</span>
558<span class="keyword">struct</span> <span class="identifier">result_of_conditional</span>
559<span class="special">{</span>
560    <span class="identifier">BOOST_TYPEOF_NESTED_TYPEDEF_TPL</span><span class="special">(</span><span class="identifier">nested</span><span class="special">,</span><span class="keyword">true</span><span class="special">?</span><span class="identifier">A</span><span class="special">():</span><span class="identifier">B</span><span class="special">())</span>
561    <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">nested</span><span class="special">::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
562<span class="special">};</span>
563
564<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">B</span><span class="special">&gt;</span>
565<span class="identifier">result_of_conditional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">min</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span>
566<span class="special">{</span>
567    <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">&lt;</span> <span class="identifier">b</span> <span class="special">?</span> <span class="identifier">a</span> <span class="special">:</span> <span class="identifier">b</span><span class="special">;</span>
568<span class="special">}</span>
569</pre>
570</div>
571</div>
572<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
573<td align="left"></td>
574<td align="right"><div class="copyright-footer">Copyright © 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
575        Distributed under the Boost Software License, Version 1.0. (See accompanying
576        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
577        http://www.boost.org/LICENSE_1_0.txt </a>)
578      </p>
579</div></td>
580</tr></table>
581<hr>
582<div class="spirit-nav">
583<a accesskey="p" href="tuto.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../typeof.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="other.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
584</div>
585</body>
586</html>
587