summaryrefslogtreecommitdiff
path: root/doc/html/typeof
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
committerAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
commit1a78a62555be32868418fe52f8e330c9d0f95d5a (patch)
treed3765a80e7d3b9640ec2e930743630cd6b9fce2b /doc/html/typeof
downloadboost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'doc/html/typeof')
-rwxr-xr-xdoc/html/typeof/ackn.html90
-rwxr-xr-xdoc/html/typeof/cont.html51
-rwxr-xr-xdoc/html/typeof/other.html326
-rwxr-xr-xdoc/html/typeof/refe.html585
-rwxr-xr-xdoc/html/typeof/tuto.html222
5 files changed, 1274 insertions, 0 deletions
diff --git a/doc/html/typeof/ackn.html b/doc/html/typeof/ackn.html
new file mode 100755
index 0000000000..cb76ca9f94
--- /dev/null
+++ b/doc/html/typeof/ackn.html
@@ -0,0 +1,90 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Acknowledgements</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
+<link rel="up" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="prev" href="cont.html" title="Contributed By:">
+<link rel="next" href="../boost_units.html" title="Chapter&#160;32.&#160;Boost.Units 1.1.0">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center"><a href="../../../index.html">Home</a></td>
+<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="cont.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="../boost_units.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="typeof.ackn"></a>Acknowledgements</h2></div></div></div>
+<p>
+ The idea of representing a type as multiple compile-time integers, and passing
+ these integers across function boundaries using sizeof(), was taken from Steve
+ Dewhurst's article "A Bitwise typeof Operator", CUJ 2002. This article
+ can also be viewed online, at <a href="http://www.semantics.org/localarchive.html" target="_top">http://www.semantics.org/localarchive.html</a>.
+ </p>
+<p>
+ Special thank you to Paul Mensonides, Vesa Karvonen, and Aleksey Gurtovoy for
+ the Boost Preprocessor Library and MPL. Without these two libraries, this typeof
+ implementation would not exist.
+ </p>
+<p>
+ The following people provided support, gave valuable comments, or in any other
+ way contributed to the library development (in alphabetical order):
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ David Abrahams
+ </li>
+<li class="listitem">
+ Andrey Beliakov
+ </li>
+<li class="listitem">
+ Joel de Guzman
+ </li>
+<li class="listitem">
+ Daniel James
+ </li>
+<li class="listitem">
+ Vesa Karvonen
+ </li>
+<li class="listitem">
+ Andy Little
+ </li>
+<li class="listitem">
+ Paul Mensonides
+ </li>
+<li class="listitem">
+ Alexander Nasonov
+ </li>
+<li class="listitem">
+ Tobias Schwinger
+ </li>
+<li class="listitem">
+ Martin Wille
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
+ http://www.boost.org/LICENSE_1_0.txt </a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="cont.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="../boost_units.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/typeof/cont.html b/doc/html/typeof/cont.html
new file mode 100755
index 0000000000..c916beaf6f
--- /dev/null
+++ b/doc/html/typeof/cont.html
@@ -0,0 +1,51 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Contributed By:</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
+<link rel="up" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="prev" href="other.html" title="Other considerations and tips">
+<link rel="next" href="ackn.html" title="Acknowledgements">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center"><a href="../../../index.html">Home</a></td>
+<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="other.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="ackn.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="typeof.cont"></a>Contributed By:</h2></div></div></div>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Compliant compilers -- Arkadiy Vertleyb, Peder Holt
+ </li>
+<li class="listitem">
+ MSVC 6.5, 7.0, 7.1 -- Igor Chesnokov, Peder Holt
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
+ http://www.boost.org/LICENSE_1_0.txt </a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="other.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="ackn.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/typeof/other.html b/doc/html/typeof/other.html
new file mode 100755
index 0000000000..10f26e1b71
--- /dev/null
+++ b/doc/html/typeof/other.html
@@ -0,0 +1,326 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Other considerations and tips</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
+<link rel="up" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="prev" href="refe.html" title="Reference">
+<link rel="next" href="cont.html" title="Contributed By:">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center"><a href="../../../index.html">Home</a></td>
+<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="refe.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="cont.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="typeof.other"></a>Other considerations and tips</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="other.html#typeof.natem">Native typeof support and emulation</a></span></dt>
+<dt><span class="section"><a href="other.html#typeof.parties">The three participating parties</a></span></dt>
+<dt><span class="section"><a href="other.html#typeof.features">Supported features</a></span></dt>
+<dt><span class="section"><a href="other.html#typeof.what">What needs to be registered?</a></span></dt>
+<dt><span class="section"><a href="other.html#typeof.limi">Limitations</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.natem"></a>Native typeof support and emulation</h3></div></div></div>
+<p>
+ Many compilers support typeof already, most noticeable GCC and Metrowerks.
+ </p>
+<p>
+ Igor Chesnokov discovered a method that allows to implement <code class="computeroutput"><span class="identifier">typeof</span></code> on the VC series of compilers. It
+ uses a bug in the Microsoft compiler that allows a nested class of base to
+ be defined in a class derived from base:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">int</span> <span class="identifier">ID</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">typeof_access</span>
+<span class="special">{</span>
+ <span class="keyword">struct</span> <span class="identifier">id2type</span><span class="special">;</span> <span class="comment">//not defined</span>
+<span class="special">};</span>
+
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">ID</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">typeof_register</span> <span class="special">:</span> <span class="identifier">typeof_access</span>
+<span class="special">{</span>
+ <span class="comment">// define base's nested class here</span>
+ <span class="keyword">struct</span> <span class="identifier">typeof_access</span><span class="special">::</span><span class="identifier">id2type</span>
+ <span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span>
+ <span class="special">};</span>
+<span class="special">};</span>
+
+<span class="comment">//Type registration function </span>
+<span class="identifier">typeof_register</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">compile</span><span class="special">-</span><span class="identifier">time</span><span class="special">-</span><span class="identifier">constant</span><span class="special">&gt;</span> <span class="identifier">register_type</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;);</span>
+
+<span class="comment">//Actually register type by instantiating typeof_register for the correct type</span>
+<span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">register_type</span><span class="special">(</span><span class="identifier">some</span><span class="special">-</span><span class="identifier">type</span><span class="special">));</span>
+
+<span class="comment">//Use the base class to access the type.</span>
+<span class="keyword">typedef</span> <span class="identifier">typeof_access</span><span class="special">::</span><span class="identifier">id2type</span><span class="special">::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
+</pre>
+<p>
+ Peder Holt adapted this method to VC7.0, where the nested class is a template
+ class that is specialized in the derived class.
+ </p>
+<p>
+ In VC8.0, it seemed that all the bug-featire had been fixed, but Steven Watanabe
+ managed to implement a more rigorous version of the VC7.0 fix that enables
+ 'typeof' to be supported 'natively' here as well.
+ </p>
+<p>
+ For many other compilers neither native <code class="computeroutput"><span class="identifier">typeof</span></code>
+ support nor the trick described above is an option. For such compilers the
+ emulation method is the only way of implementing <code class="computeroutput"><span class="identifier">typeof</span></code>.
+ </p>
+<p>
+ According to a rough estimate, at the time of this writing the introduction
+ of the <code class="computeroutput"><span class="identifier">typeof</span></code>, <code class="computeroutput"><span class="keyword">auto</span></code>, etc., into the C++ standard may not
+ happen soon. Even after it's done, some time still has to pass before most
+ compilers implement this feature. But even after that, there always are legacy
+ compilers to support (for example now, in 2005, many people are still using
+ VC6, long after VC7.x, and even VC8.0 beta became available).
+ </p>
+<p>
+ Considering extreme usefulness of the feature right now, it seems to make
+ sense to implement it at the library level.
+ </p>
+<p>
+ The emulation mode seems to be important even if a better option is present
+ on some particular compiler. If a library author wants to develop portable
+ code using <code class="computeroutput"><span class="identifier">typeof</span></code>, she needs
+ to use emulation mode and register her types and templates. Those users who
+ have a better option can still take advantage of it, since the registration
+ macros are defined as no-op on such compilers, while the users for whom emulation
+ is the only option will use it.
+ </p>
+<p>
+ The other consideration applies to the users of VC7.1. Even though the more
+ convenient <code class="computeroutput"><span class="identifier">typeof</span></code> trick is
+ available, the possibility of upgrade to VC8, where emulation remains the
+ only option, should be considered.
+ </p>
+<p>
+ The emulation mode can be forced on the compilers that don't use it by default
+ by defining the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_COMPLIANT</span></code>
+ symbol:
+ </p>
+<pre class="programlisting"><span class="identifier">g</span><span class="special">++</span> <span class="special">-</span><span class="identifier">D</span> <span class="identifier">BOOST_TYPEOF_COMPLIANT</span> <span class="special">-</span><span class="identifier">I</span> <span class="special">\</span><span class="identifier">boost</span><span class="special">\</span><span class="identifier">boost_1_32_0</span> <span class="identifier">main</span><span class="special">.</span><span class="identifier">cpp</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.parties"></a>The three participating parties</h3></div></div></div>
+<p>
+ The Lambda example from the Motivation section requires the following registration:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuples</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">lambda_functor</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">lambda_functor_base</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">relational_action</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">logical_action</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">other_action</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">greater_action</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">less_action</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">and_action</span><span class="special">);</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">::</span><span class="identifier">placeholder</span><span class="special">,</span> <span class="special">(</span><span class="keyword">int</span><span class="special">));</span>
+</pre>
+<p>
+ It may seem that the price for the ability to discover the expression's type
+ is too high: rather large amount of registration is required. However note
+ that all of the above registration is done only once, and after that, any
+ combination of the registered types and templates would be handled. Moreover,
+ this registration is typically done not by the end-user, but rather by a
+ layer on top of some library (in this example -- Boost.Lambda).
+ </p>
+<p>
+ When thinking about this, it's helpful to consider three parties: the typeof
+ facility, the library (probably built on expression templates principle),
+ and the end-user. The typeof facility is responsible for registering fundamental
+ types. The library can register its own types and templates.
+ </p>
+<p>
+ In the best-case scenario, if the expressions always consist of only fundamental
+ types and library-defined types and templates, a library author can achieve
+ the impression that the <code class="computeroutput"><span class="identifier">typeof</span></code>
+ is natively supported for her library. On the other hand, the more often
+ expressions contain user-defined types, the more responsibility is put on
+ the end-user, and therefore the less attractive this approach becomes.
+ </p>
+<p>
+ Thus, the ratio of user-defined types in the expressions should be the main
+ factor to consider when deciding whether or not to apply the typeof facility.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.features"></a>Supported features</h3></div></div></div>
+<p>
+ The Typeof library pre-registers fundamental types. For these types, and
+ for any other types/templates registered by the user library or end-user,
+ any combination of the following is supported:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Pointers;
+ </li>
+<li class="listitem">
+ References (except top-level);
+ </li>
+<li class="listitem">
+ Consts (except top-level);
+ </li>
+<li class="listitem">
+ Volatiles (except top-level);
+ </li>
+<li class="listitem">
+ Arrays;
+ </li>
+<li class="listitem">
+ Functions, function pointers, and references;
+ </li>
+<li class="listitem">
+ Pointers to member functions;
+ </li>
+<li class="listitem">
+ Pointers to data members.
+ </li>
+</ul></div>
+<p>
+ For example the following type:
+ </p>
+<pre class="programlisting"><span class="keyword">int</span><span class="special">&amp;</span> <span class="special">(*)(</span><span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keyword">char</span><span class="special">*,</span> <span class="keyword">double</span><span class="special">[</span><span class="number">5</span><span class="special">],</span> <span class="keyword">void</span><span class="special">(*)(</span><span class="keyword">short</span><span class="special">))</span>
+</pre>
+<p>
+ is supported right away, and something like:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="special">(</span><span class="identifier">MyClass</span><span class="special">::*)(</span><span class="keyword">int</span> <span class="identifier">MyClass</span><span class="special">::*,</span> <span class="identifier">MyClass</span><span class="special">[</span><span class="number">10</span><span class="special">])</span> <span class="keyword">const</span>
+</pre>
+<p>
+ is supported provided <code class="computeroutput"><span class="identifier">MyClass</span></code>
+ is registered.
+ </p>
+<p>
+ The Typeof Library also provides registration files for most STL classes/templates.
+ These files are located in the std subdirectory, and named after corresponding
+ STL headers. These files are not included by the typeof system and have to
+ be explicitly included by the user, as needed:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">std</span><span class="special">/</span><span class="identifier">functional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">fun</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind2nd</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(),</span> <span class="number">21</span><span class="special">));</span> <span class="comment">//create named function object for future use.</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.what"></a>What needs to be registered?</h3></div></div></div>
+<p>
+ It is possible to take advantage of the compiler when registering types for
+ the Typeof Library. Even though there is currently no direct support for
+ typeof in the language, the compiler is aware of what the type of an expression
+ is, and gives an error if it encounters an expression that has not been handled
+ correctly. In the <code class="computeroutput"><span class="identifier">typeof</span></code>
+ context, this error message will contain clues to what types needs to be
+ registered with the Typeof Library in order for <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code>
+ to work.
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span> <span class="special">{};</span>
+
+<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">bool</span> <span class="identifier">B</span><span class="special">&gt;</span>
+<span class="keyword">struct</span> <span class="identifier">Y</span> <span class="special">{};</span>
+
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">true</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">a</span><span class="special">;</span>
+
+<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span><span class="identifier">b</span><span class="special">);</span>
+</pre>
+<p>
+ We get the following error message from VC7.1
+ </p>
+<pre class="programlisting">error C2504: 'boost::type_of::'anonymous-namespace'::encode_type_impl&lt;V,Type_Not_Registered_With_Typeof_System&gt;' : base
+ class undefined
+ with
+ [
+ V=boost::type_of::'anonymous-namespace'::encode_type_impl&lt;boost::mpl::vector0&lt;boost::mpl::na&gt;,std::pair&lt;X,Y&lt;int,true&gt;&gt;&gt;::V0,
+ Type_Not_Registered_With_Typeof_System=X
+ ]
+</pre>
+<p>
+ Inspecting this error message, we see that the compiler complains about
+ <code class="computeroutput"><span class="identifier">X</span></code>
+ </p>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">X</span><span class="special">);</span> <span class="comment">//register X with the typeof system</span>
+</pre>
+<p>
+ Recompiling, we get a new error message from VC7.1
+ </p>
+<pre class="programlisting">error C2504: 'boost::type_of::'anonymous-namespace'::encode_type_impl&lt;V,Type_Not_Registered_With_Typeof_System&gt;' : base
+ class undefined
+ with
+ [
+ V=boost::type_of::'anonymous-namespace'::encode_type_impl&lt;boost::mpl::vector0&lt;boost::mpl::na&gt;,std::pair&lt;X,Y&lt;int,true&gt;&gt;&gt;::V1,
+ Type_Not_Registered_With_Typeof_System=Y&lt;int,true&gt;
+ ]
+</pre>
+<p>
+ Inspecting this error message, we see that the compiler complains about
+ <code class="computeroutput"><span class="identifier">Y</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">true</span><span class="special">&gt;</span></code>. Since <code class="computeroutput"><span class="identifier">Y</span></code>
+ is a template, and contains integral constants, we need to take more care
+ when registering:
+ </p>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">Y</span><span class="special">,(</span><span class="keyword">typename</span><span class="special">)(</span><span class="keyword">bool</span><span class="special">));</span> <span class="comment">//register template class Y</span>
+</pre>
+<p>
+ It is a good idea to look up the exact definition of <code class="computeroutput"><span class="identifier">Y</span></code>
+ when it contains integral constants. For simple template classes containing
+ only typenames, you can rely solely on the compiler error.
+ </p>
+<p>
+ The above code now compiles.
+ </p>
+<p>
+ This technique can be used to get an overview of which types needs to be
+ registered for a given project in order to support <code class="computeroutput"><span class="identifier">typeof</span></code>.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.limi"></a>Limitations</h3></div></div></div>
+<p>
+ Nested template template parameters are not supported, like:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Tpl</span><span class="special">&gt;</span>
+<span class="keyword">class</span> <span class="identifier">A</span><span class="special">;</span> <span class="comment">// can't register!</span>
+</pre>
+<p>
+ Classes and templates nested inside other templates also can't be registered
+ because of the issue of nondeduced context. This limitation is most noticeable
+ with regards to standard iterators in Dinkumware STL, which are implemented
+ as nested classes. Instead, instantiations can be registered:
+ </p>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span><span class="special">)</span>
+</pre>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
+ http://www.boost.org/LICENSE_1_0.txt </a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="refe.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="cont.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/typeof/refe.html b/doc/html/typeof/refe.html
new file mode 100755
index 0000000000..756317fbdd
--- /dev/null
+++ b/doc/html/typeof/refe.html
@@ -0,0 +1,585 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Reference</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
+<link rel="up" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="prev" href="tuto.html" title="Tutorial">
+<link rel="next" href="other.html" title="Other considerations and tips">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center"><a href="../../../index.html">Home</a></td>
+<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<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>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="typeof.refe"></a>Reference</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="refe.html#typeof.auto">AUTO, AUTO_TPL</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.compl">COMPLIANT</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.incr">INCREMENT_REGISTRATION_GROUP</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.inte">INTEGRAL</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.limit_func">LIMIT_FUNCTION_ARITY</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.messages">MESSAGES</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.limit_size">LIMIT_SIZE</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.regtype">REGISTER_TYPE</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.regtemp">REGISTER_TEMPLATE</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.temp">TEMPLATE</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.typo">TYPEOF, TYPEOF_TPL</a></span></dt>
+<dt><span class="section"><a href="refe.html#typeof.typn">TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.auto"></a>AUTO, AUTO_TPL</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_AUTO</span></code> macro emulates
+ the proposed <code class="computeroutput"><span class="keyword">auto</span></code> keyword in
+ C++.
+ </p>
+<h5>
+<a name="auto.usage"></a>
+ Usage
+ </h5>
+<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>
+<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>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">var</span></dt>
+<dd><p>
+ a variable to be initialized with the expression
+ </p></dd>
+<dt><span class="term">expr</span></dt>
+<dd><p>
+ a valid c++ expression
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="auto.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ If you want to use <code class="computeroutput"><span class="keyword">auto</span></code> in a
+ 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>,
+ which takes care of the <code class="computeroutput"><span class="keyword">typename</span></code>
+ keyword inside the <code class="computeroutput"><span class="keyword">auto</span></code> expression.
+ </p>
+<h5>
+<a name="auto.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <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>
+ <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>
+ <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>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.compl"></a>COMPLIANT</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_COMPLIANT</span></code>
+ macro can be used to force the emulation mode. Define it if your compiler
+ by default uses another mode, such as native <code class="computeroutput"><span class="identifier">typeof</span></code>
+ or Microsoft-specific trick, but you want to use the emulation mode, for
+ example for portability reasons.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.incr"></a>INCREMENT_REGISTRATION_GROUP</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span></code>
+ macro ensures that type registrations in different header files receive unique
+ identifiers.
+ </p>
+<h5>
+<a name="incr.usage"></a>
+ Usage
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+</pre>
+<h5>
+<a name="incr.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ specified once in every cpp/hpp file where any registration is performed,
+ before any registration.
+ </p>
+<h5>
+<a name="incr.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="keyword">class</span> <span class="identifier">X</span><span class="special">;</span>
+<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.inte"></a>INTEGRAL</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span></code>
+ macro is used when registering an integral template parameter using <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>.
+ </p>
+<p>
+ Useful for <code class="computeroutput"><span class="keyword">enum</span></code>s and dependent
+ integral template parameters.
+ </p>
+<h5>
+<a name="inte.usage"></a>
+ Usage
+ </h5>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">x</span></dt>
+<dd><p>
+ a fully qualified integral type or enum
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="inte.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ A short syntax has been implemented for the built in types (int, bool, long,
+ unsigned long, etc.) Other non-type template parameters (e.g. pointer to
+ member) are not supported.
+ </p>
+<h5>
+<a name="inte.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="keyword">namespace</span> <span class="identifier">foo</span>
+<span class="special">{</span>
+ <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>
+
+ <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>
+ <span class="keyword">class</span> <span class="identifier">class_with_enum</span> <span class="special">{};</span>
+
+ <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>
+ <span class="keyword">class</span> <span class="identifier">class_with_dependent_non_type</span> <span class="special">{};</span>
+<span class="special">}</span>
+
+<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>
+ <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>
+ <span class="special">(</span><span class="keyword">typename</span><span class="special">)</span>
+ <span class="special">)</span>
+
+<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>
+ <span class="special">(</span><span class="keyword">typename</span><span class="special">)</span>
+ <span class="special">(</span><span class="identifier">BOOST_TYPEOF_INTEGRAL</span><span class="special">(</span><span class="identifier">P0</span><span class="special">))</span>
+ <span class="special">)</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.limit_func"></a>LIMIT_FUNCTION_ARITY</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_FUNCTION_ARITY</span></code>
+ macro defines how many parameters are supported for functios, and applies
+ to functions, function pointers, function references, and member function
+ pointers. The default value is 10. Redefine if you want the Typeof Library
+ to handle functions with more parameters.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.messages"></a>MESSAGES</h3></div></div></div>
+<p>
+ Define <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_MESSAGE</span></code>
+ before including boost/typeof/typeof.hpp to include messages "using
+ typeof emulation" and "using native typeof". By default, these
+ messages will not be displayed.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.limit_size"></a>LIMIT_SIZE</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_SIZE</span></code>
+ macro defines the size of the compile-time sequence used to encode a type.
+ The default value is 50. Increase it if you want the Typeof Library to handle
+ very complex types, although this possibility is limited by the maximum number
+ of template parameters supported by your compiler. On the other hand, if
+ you work only with very simple types, decreasing this number may help to
+ boost compile-time performance.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.regtype"></a>REGISTER_TYPE</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span></code>
+ macro informs the Typeof Library about the existence of a type
+ </p>
+<h5>
+<a name="regtype.usage"></a>
+ Usage
+ </h5>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">x</span></dt>
+<dd><p>
+ a fully qualified type
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="regtype.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ Must be used in the global namespace
+ </p>
+<h5>
+<a name="regtype.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="keyword">namespace</span> <span class="identifier">foo</span>
+<span class="special">{</span>
+ <span class="keyword">class</span> <span class="identifier">bar</span> <span class="special">{};</span>
+ <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>
+<span class="special">}</span>
+
+<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>
+<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>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.regtemp"></a>REGISTER_TEMPLATE</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>
+ macro informs the Typeof Library about the existence of a template and describes
+ its parameters
+ </p>
+<h5>
+<a name="regtemp.usage"></a>
+ Usage
+ </h5>
+<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>
+<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>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">x</span></dt>
+<dd><p>
+ a fully qualified template
+ </p></dd>
+<dt><span class="term">n</span></dt>
+<dd><p>
+ the number of template arguments. Only valid if all template arguments
+ are typenames
+ </p></dd>
+<dt><span class="term">seq</span></dt>
+<dd><p>
+ a sequence of template arguments. Must be used when integral or template
+ template parameters are present
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="regtemp.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ Must be used in the global namespace.
+ </p>
+<p>
+ The library allows registration of templates with type, integral, and template
+ template parameters:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ 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>
+ or <code class="computeroutput"><span class="special">(</span><span class="keyword">typename</span><span class="special">)</span></code> sequence element
+ </li>
+<li class="listitem">
+ A template parameter of a well-known integral type can be described by
+ 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
+ are supported:
+ <div class="itemizedlist"><ul class="itemizedlist" type="circle">
+<li class="listitem">
+ <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>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">short</span></code>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">int</span></code>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="special">[</span><span class="keyword">unsigned</span><span class="special">]</span> <span class="keyword">long</span></code>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="keyword">unsigned</span></code>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="keyword">bool</span></code>
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">size_t</span></code>
+ </li>
+</ul></div>
+ </li>
+<li class="listitem">
+ Enums and typedefs of integral types, need to be described explicitly
+ with the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_INTEGRAL</span></code>
+ 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>
+ </li>
+<li class="listitem">
+ Template template parameters are described with the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span></code>
+ 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>.
+ In case of all type parameters this can be shortened to something like
+ <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>.
+ The nested template template parameters are not supported.
+ </li>
+</ul></div>
+<h5>
+<a name="regtemp.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="keyword">namespace</span> <span class="identifier">foo</span>
+<span class="special">{</span>
+ <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>
+ <span class="keyword">class</span> <span class="identifier">simple_template</span> <span class="special">{};</span>
+
+ <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>
+ <span class="keyword">class</span> <span class="identifier">class_with_integral_constant</span> <span class="special">{};</span>
+<span class="special">}</span>
+
+<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>
+<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>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.temp"></a>TEMPLATE</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span></code>
+ macro is used when registering template template parameters using <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span></code>.
+ </p>
+<h5>
+<a name="temp.usage"></a>
+ Usage
+ </h5>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span>
+<span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="identifier">seq</span><span class="special">)</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">n</span></dt>
+<dd><p>
+ the number of template arguments. Only valid if all template arguments
+ are typenames
+ </p></dd>
+<dt><span class="term">seq</span></dt>
+<dd><p>
+ a sequence of template arguments. Must be used when there are integral
+ constants in the nested template
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="temp.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ Can not be used to register nested template template parameters.
+ </p>
+<h5>
+<a name="temp.sample_code"></a>
+ Sample Code
+ </h5>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+
+<span class="keyword">namespace</span> <span class="identifier">foo</span>
+<span class="special">{</span>
+ <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>
+
+ <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>
+ <span class="keyword">class</span> <span class="identifier">nested_template_class</span> <span class="special">{};</span>
+
+ <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>
+ <span class="keyword">class</span> <span class="identifier">nested_with_integral</span> <span class="special">{};</span>
+<span class="special">}</span>
+
+<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>
+ <span class="special">(</span><span class="identifier">foo</span><span class="special">::</span><span class="identifier">color</span><span class="special">)</span>
+ <span class="special">(</span><span class="identifier">BOOST_TYPEOF_TEMPLATE</span><span class="special">(</span><span class="number">1</span><span class="special">))</span>
+ <span class="special">)</span>
+
+<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>
+ <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>
+ <span class="special">)</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.typo"></a>TYPEOF, TYPEOF_TPL</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code> macro calculates
+ 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>
+ </p>
+<h5>
+<a name="typo.usage"></a>
+ Usage
+ </h5>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span>
+<span class="identifier">BOOST_TYPEOF_TPL</span><span class="special">(</span><span class="identifier">expr</span><span class="special">)</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">expr</span></dt>
+<dd><p>
+ a valid c++ expression that can be bound to const T&amp;
+ </p></dd>
+</dl>
+</div>
+<h5>
+<a name="typo.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ If you want to use <code class="computeroutput"><span class="identifier">typeof</span></code>
+ 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>,
+ which takes care of <code class="computeroutput"><span class="keyword">typename</span></code>
+ inside the <code class="computeroutput"><span class="identifier">typeof</span></code> expression.
+ </p>
+<h5>
+<a name="typo.sample_code"></a>
+ Sample Code
+ </h5>
+<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>
+<span class="keyword">struct</span> <span class="identifier">result_of_conditional</span>
+<span class="special">{</span>
+ <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>
+<span class="special">};</span>
+
+<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>
+<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>
+<span class="special">{</span>
+ <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>
+<span class="special">}</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="typeof.typn"></a>TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL</h3></div></div></div>
+<p>
+ The <code class="computeroutput"><span class="identifier">TYPEOF_NESTED_TYPEDEF</span></code>
+ macro works in much the same way as the 'TYPEOF' macro does, but workarounds
+ several compiler deficiencies.
+ </p>
+<h5>
+<a name="typn.usage"></a>
+ Usage
+ </h5>
+<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>
+<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>
+</pre>
+<div class="variablelist">
+<p class="title"><b>Arguments</b></p>
+<dl>
+<dt><span class="term">name</span></dt>
+<dd>
+<p>
+ a valid identifier to nest the typeof operation inside
+ </p>
+<p>
+ expr
+ </p>
+<p>
+ a valid c++ expression that can be bound to const T&amp;
+ </p>
+</dd>
+</dl>
+</div>
+<h5>
+<a name="typn.remarks"></a>
+ Remarks
+ </h5>
+<p>
+ 'typeof_nested_typedef' nests the 'typeof' operation inside a struct. By
+ doing this, the 'typeof' operation can be split into two steps, deconfusing
+ several compilers (notably VC7.1 and VC8.0) on the way. This also removes
+ the limitation imposed by <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_LIMIT_SIZE</span></code>
+ and allows you to use 'typeof' on much larger expressions.
+ </p>
+<p>
+ If you want to use <code class="computeroutput"><span class="identifier">typeof_nested_typedef</span></code>
+ 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>,
+ which takes care of <code class="computeroutput"><span class="keyword">typename</span></code>
+ inside the <code class="computeroutput"><span class="identifier">typeof</span></code> expression.
+ </p>
+<p>
+ 'typeof_nested_typedef' can not be used at function/block scope.
+ </p>
+<h5>
+<a name="typn.sample_code"></a>
+ Sample Code
+ </h5>
+<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>
+<span class="keyword">struct</span> <span class="identifier">result_of_conditional</span>
+<span class="special">{</span>
+ <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>
+ <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>
+<span class="special">};</span>
+
+<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>
+<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>
+<span class="special">{</span>
+ <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>
+<span class="special">}</span>
+</pre>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
+ http://www.boost.org/LICENSE_1_0.txt </a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<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>
+</div>
+</body>
+</html>
diff --git a/doc/html/typeof/tuto.html b/doc/html/typeof/tuto.html
new file mode 100755
index 0000000000..2ae1743dc3
--- /dev/null
+++ b/doc/html/typeof/tuto.html
@@ -0,0 +1,222 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Tutorial</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
+<link rel="up" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="prev" href="../typeof.html" title="Chapter&#160;31.&#160;Boost.Typeof">
+<link rel="next" href="refe.html" title="Reference">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center"><a href="../../../index.html">Home</a></td>
+<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../typeof.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="refe.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="typeof.tuto"></a>Tutorial</h2></div></div></div>
+<p>
+ To start using typeof include the typeof header:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+</pre>
+<p>
+ To deduce the type of an expression at compile time use the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code>
+ macro:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex1</span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="number">1</span> <span class="special">+</span> <span class="number">0.5</span><span class="special">)</span> <span class="identifier">type</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ In the dependent context use <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TPL</span></code>
+ instead of <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code>:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex2</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
+ <span class="identifier">BOOST_TYPEOF_TPL</span><span class="special">(</span><span class="identifier">T</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">U</span><span class="special">())</span> <span class="identifier">add</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&amp;</span> <span class="identifier">u</span><span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">t</span> <span class="special">+</span> <span class="identifier">u</span><span class="special">;</span>
+ <span class="special">};</span>
+
+ <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">add</span><span class="special">(</span><span class="char">'a'</span><span class="special">,</span> <span class="number">1.5</span><span class="special">))</span> <span class="identifier">type</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ The above examples are possible because the Typeof Library knows about primitive
+ types, such as <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">double</span></code>, <code class="computeroutput"><span class="keyword">char</span></code>,
+ etc. The Typeof Library also knows about most types and templates defined by
+ the Standard C++ Library, but the appropriate headers need to be included to
+ take advantage of this:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">std</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+
+<span class="keyword">namespace</span> <span class="identifier">ex3</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">));</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">p</span><span class="special">),</span> <span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Here <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">std</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
+ includes <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">utility</span><span class="special">&gt;</span></code> and contains knowledge about templates
+ defined there. This naming convention applies in general, for example to let
+ the Typeof Library handle <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>,
+ include <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">std</span><span class="special">/</span><span class="identifier">vector</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>,
+ etc.
+ </p>
+<p>
+ To deduce the type of a variable from the expression, this variable is initialized
+ with, use the <code class="computeroutput"><span class="identifier">BOOST_AUTO</span></code> macro
+ (or <code class="computeroutput"><span class="identifier">BOOST_AUTO_TPL</span></code> in a dependent
+ context:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">typeof</span><span class="special">/</span><span class="identifier">std</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+
+<span class="keyword">namespace</span> <span class="identifier">ex4</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="keyword">new</span> <span class="keyword">int</span><span class="special">[</span><span class="number">20</span><span class="special">]);</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">p</span><span class="special">),</span> <span class="keyword">int</span><span class="special">*&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Both <code class="computeroutput"><span class="identifier">BOOST_TYPEOF</span></code> and <code class="computeroutput"><span class="identifier">BOOST_AUTO</span></code> strip top-level qualifiers. Therefore,
+ to allocate for example a reference, it has to be specified explicitly:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex5</span>
+<span class="special">{</span>
+ <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">hello</span><span class="special">()</span>
+ <span class="special">{</span>
+ <span class="keyword">static</span> <span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"hello"</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">s</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">BOOST_AUTO</span><span class="special">(&amp;</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">hello</span><span class="special">());</span>
+<span class="special">}</span>
+</pre>
+<p>
+ To better understand this syntax, note that this gets expanded into:
+ </p>
+<pre class="programlisting"><span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">hello</span><span class="special">())</span> <span class="special">&amp;</span><span class="identifier">s</span> <span class="special">=</span> <span class="identifier">hello</span><span class="special">();</span>
+</pre>
+<p>
+ If your define your own type, the Typeof Library cannot handle it unless you
+ let it know about this type. You tell the Typeof Library about a type (or template)
+ by the means of "registering" this type/template.
+ </p>
+<p>
+ Any source or header file where types/templates are registered has to contain
+ the following line before any registration is done:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
+</pre>
+<p>
+ After this a type can be registered:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex6</span>
+<span class="special">{</span>
+ <span class="keyword">struct</span> <span class="identifier">MyType</span>
+ <span class="special">{};</span>
+<span class="special">}</span>
+
+<span class="identifier">BOOST_TYPEOF_REGISTER_TYPE</span><span class="special">(</span><span class="identifier">ex6</span><span class="special">::</span><span class="identifier">MyType</span><span class="special">)</span>
+</pre>
+<p>
+ The registration must be done from the context of global namespace; fully qualified
+ type name has to be used.
+ </p>
+<p>
+ Any number of types can be registered in one file, each on a separate line.
+ </p>
+<p>
+ Once your type is registered, the Typeof Library can handle it in any context:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex6</span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">MyType</span><span class="special">()))</span> <span class="identifier">type</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">MyType</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ A template is registered by specifying its fully qualified name, and describing
+ its parameters. In the simplest case, when all parameters are type parameters,
+ only their number needs to be specified:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex7</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
+ <span class="keyword">struct</span> <span class="identifier">MyTemplate</span>
+ <span class="special">{};</span>
+<span class="special">}</span>
+
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">ex7</span><span class="special">::</span><span class="identifier">MyTemplate</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span>
+
+<span class="keyword">namespace</span> <span class="identifier">ex7</span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">ex6</span><span class="special">::</span><span class="identifier">MyType</span><span class="special">&gt;()))</span> <span class="identifier">type</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">,</span>
+ <span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">ex6</span><span class="special">::</span><span class="identifier">MyType</span><span class="special">&gt;</span> <span class="special">&gt;</span>
+ <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ When a template has integral template parameters, all parameters need to be
+ described in the preprocessor sequence:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">ex8</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">n</span><span class="special">&gt;</span>
+ <span class="keyword">struct</span> <span class="identifier">MyTemplate</span>
+ <span class="special">{};</span>
+<span class="special">}</span>
+
+<span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">ex8</span><span class="special">::</span><span class="identifier">MyTemplate</span><span class="special">,</span> <span class="special">(</span><span class="keyword">class</span><span class="special">)(</span><span class="keyword">int</span><span class="special">))</span>
+
+<span class="keyword">namespace</span> <span class="identifier">ex8</span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="identifier">ex7</span><span class="special">::</span><span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="identifier">ex6</span><span class="special">::</span><span class="identifier">MyType</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;,</span> <span class="number">0</span><span class="special">&gt;()))</span> <span class="identifier">type</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">,</span>
+ <span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="identifier">ex7</span><span class="special">::</span><span class="identifier">MyTemplate</span><span class="special">&lt;</span><span class="identifier">ex6</span><span class="special">::</span><span class="identifier">MyType</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;,</span> <span class="number">0</span><span class="special">&gt;</span> <span class="special">&gt;</span>
+ <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Please see the reference for more details.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2004, 2005 Arkadiy Vertleyb, Peder Holt<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">
+ http://www.boost.org/LICENSE_1_0.txt </a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../typeof.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="refe.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>