4f93f21dcc
[SVN r40714]
123 lines
7.8 KiB
HTML
123 lines
7.8 KiB
HTML
<?xml version="1.0" encoding="utf-8" ?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
<!-- Copyright Aleksey Gurtovoy 2006. Distributed under the Boost -->
|
|
<!-- Software License, Version 1.0. (See accompanying -->
|
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
|
<title>THE BOOST MPL LIBRARY: Details</title>
|
|
<link rel="stylesheet" href="../style.css" type="text/css" />
|
|
</head>
|
|
<body class="docframe">
|
|
<table class="header"><tr class="header"><td class="header-group navigation-bar"><span class="navigation-group"><a href="./the-importance-of-being.html" class="navigation-link">Prev</a> <a href="./exercises.html" class="navigation-link">Next</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./lambda-details.html" class="navigation-link">Back</a> <a href="./exercises.html" class="navigation-link">Along</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./tutorial-metafunctions.html" class="navigation-link">Up</a> <a href="../index.html" class="navigation-link">Home</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./tutorial_toc.html" class="navigation-link">Full TOC</a></span></td>
|
|
<td class="header-group page-location"><a href="../index.html" class="navigation-link">Front Page</a> / <a href="./tutorial-metafunctions.html" class="navigation-link">Tutorial: Metafunctions and Higher-Order Metaprogramming</a> / <a href="./details.html" class="navigation-link">Details</a></td>
|
|
</tr></table><div class="header-separator"></div>
|
|
<div class="section" id="details">
|
|
<h1><a class="toc-backref" href="./tutorial-metafunctions.html#id59" name="details">Details</a></h1>
|
|
<p>By now you should have a fairly complete view of the fundamental
|
|
concepts and language of both template metaprogramming in general
|
|
and of the Boost Metaprogramming Library. This section
|
|
reviews the highlights.</p>
|
|
<dl>
|
|
<dt>Metafunction forwarding.</dt>
|
|
<dd>The technique of using public derivation to
|
|
supply the nested <tt class="literal"><span class="pre">type</span></tt> of a metafunction by accessing the one
|
|
provided by its base class.</dd>
|
|
<dt>Metafunction class.</dt>
|
|
<dd>The most basic way to formulate a compile-time
|
|
function so that it can be treated as polymorphic metadata; that
|
|
is, as a type. A metafunction class is a class with a nested
|
|
metafunction called <tt class="literal"><span class="pre">apply</span></tt>.</dd>
|
|
<dt>MPL.</dt>
|
|
<dd><p class="first">Most of this book's examples will use the Boost
|
|
Metaprogramming Library. Like the Boost type traits headers,
|
|
MPL
|
|
headers follow a simple convention:</p>
|
|
<pre class="literal-block">
|
|
#include <boost/mpl/<em>component-name</em>.hpp>
|
|
</pre>
|
|
<p class="last">If the component's name ends in an underscore, however, the
|
|
corresponding MPL header name does not include the trailing
|
|
underscore. For example, <tt class="literal"><span class="pre">mpl::bool_</span></tt> can be found in
|
|
<tt class="literal"><span class="pre"><boost/mpl/bool.hpp></span></tt>. Where the library deviates from this
|
|
convention, we'll be sure to point it out to you.</p>
|
|
</dd>
|
|
</dl>
|
|
<!-- @ignore() -->
|
|
<dl>
|
|
<dt>Higher-order function.</dt>
|
|
<dd>A function that operates on or returns a function. Making
|
|
metafunctions polymorphic with other metadata is a key
|
|
ingredient in higher-order metaprogramming.</dd>
|
|
<dt>Lambda expression.</dt>
|
|
<dd>Simply put, a lambda expression is callable metadata. Without
|
|
some form of callable metadata, higher-order metafunctions
|
|
would be impossible. Lambda expressions have two basic forms:
|
|
<em>metafunction classes</em> and <em>placeholder expressions</em>.</dd>
|
|
<dt>Placeholder expression.</dt>
|
|
<dd><p class="first">A kind of lambda expression that, through the use of
|
|
placeholders, enables in-place <em>partial metafunction
|
|
application</em> and <em>metafunction composition</em>. As you will see
|
|
throughout this book, these features give us the truly amazing
|
|
ability to build up almost any kind of complex type computation
|
|
from more primitive metafunctions, right at its point of use:</p>
|
|
<pre class="literal-block">
|
|
// find the position of a type x in some_sequence such that:
|
|
// x is convertible to 'int'
|
|
// && x is not 'char'
|
|
// && x is not a floating type
|
|
typedef mpl::find_if<
|
|
some_sequence
|
|
, mpl::and_<
|
|
boost::is_convertible<_1,int>
|
|
, mpl::not_<boost::is_same<_1,char> >
|
|
, mpl::not_<boost::is_float<_1> >
|
|
>
|
|
>::type iter;
|
|
</pre>
|
|
<p class="last">Placeholder expressions make good on the promise of algorithm reuse
|
|
without forcing us to write new metafunction classes. The
|
|
corresponding capability is often sorely missed in the runtime
|
|
world of the STL, since it is often much easier to write a loop
|
|
by hand than it is to use standard algorithms, despite their
|
|
correctness and efficiency advantages.</p>
|
|
</dd>
|
|
</dl>
|
|
<!-- @ example.prepend('''
|
|
#include <boost/mpl/and.hpp>
|
|
#include <boost/mpl/not.hpp>
|
|
#include <boost/mpl/find_if.hpp>
|
|
#include <boost/type_traits/is_convertible.hpp>
|
|
#include <boost/type_traits/is_float.hpp>
|
|
typedef mpl::vector<char, double, short, long> some_sequence;
|
|
''')
|
|
compile() -->
|
|
<dl>
|
|
<dt>The <tt class="literal"><span class="pre">lambda</span></tt> metafunction.</dt>
|
|
<dd>A metafunction that transforms a lambda expression into a
|
|
corresponding metafunction class. For detailed information on
|
|
<tt class="literal"><span class="pre">lambda</span></tt> and the lambda evaluation process,
|
|
please see the <a class="reference" href="./reference-manual.html">the MPL reference manual</a>.</dd>
|
|
<dt>The <tt class="literal"><span class="pre">apply</span></tt> metafunction.</dt>
|
|
<dd>A metafunction that invokes its first argument, which must be a
|
|
lambda expression, on its remaining arguments. In general, to
|
|
invoke a lambda expression, you should always pass it to
|
|
<tt class="literal"><span class="pre">mpl::apply</span></tt> along with the arguments you want to apply it
|
|
to in lieu of using <tt class="literal"><span class="pre">lambda</span></tt> and invoking the result "manually."</dd>
|
|
<dt>Lazy evaluation.</dt>
|
|
<dd>A strategy of delaying evaluation until a result is
|
|
required, thereby avoiding any unnecessary computation and any
|
|
associated unnecessary errors. Metafunctions are only invoked
|
|
when we access their nested <tt class="literal"><span class="pre">::type</span></tt>s, so we can supply all
|
|
of their arguments without performing any computation and
|
|
delay evaluation to the last possible moment.</dd>
|
|
</dl>
|
|
</div>
|
|
|
|
<div class="footer-separator"></div>
|
|
<table class="footer"><tr class="footer"><td class="header-group navigation-bar"><span class="navigation-group"><a href="./the-importance-of-being.html" class="navigation-link">Prev</a> <a href="./exercises.html" class="navigation-link">Next</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./lambda-details.html" class="navigation-link">Back</a> <a href="./exercises.html" class="navigation-link">Along</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./tutorial-metafunctions.html" class="navigation-link">Up</a> <a href="../index.html" class="navigation-link">Home</a></span><span class="navigation-group-separator"> | </span><span class="navigation-group"><a href="./tutorial_toc.html" class="navigation-link">Full TOC</a></span></td>
|
|
</tr></table></body>
|
|
</html>
|