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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</span><span class="identifier">color</span> <span class="identifier">C0</span><span class="special">,</span> <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">T1</span><span class="special">></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"><</span><span class="keyword">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> <span class="keyword">class</span> <span class="identifier">T1</span><span class="special">></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">&</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& 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"><</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">></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"><</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">></span> 495<span class="identifier">result_of_conditional</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="identifier">min</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&</span> <span class="identifier">a</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&</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"><</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& 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"><</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">></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"><</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">></span> 565<span class="identifier">result_of_conditional</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="identifier">min</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&</span> <span class="identifier">a</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&</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"><</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