mpl/doc/tutorial/placeholder-expression.html
2007-11-03 03:25:13 +00:00

101 lines
5.3 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: Placeholder Expression Definition</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="./placeholders.html" class="navigation-link">Prev</a>&nbsp;<a href="./lambda-and-non.html" class="navigation-link">Next</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./placeholders.html" class="navigation-link">Back</a>&nbsp;<a href="./lambda-and-non.html" class="navigation-link">Along</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./lambda-details.html" class="navigation-link">Up</a>&nbsp;<a href="../index.html" class="navigation-link">Home</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</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="./lambda-details.html" class="navigation-link">Lambda Details</a> / <a href="./placeholder-expression.html" class="navigation-link">Placeholder Expression Definition</a></td>
</tr></table><div class="header-separator"></div>
<div class="section" id="placeholder-expression">
<h1><a class="toc-backref" href="./lambda-details.html#id56" name="placeholder-expression">Placeholder Expression Definition</a></h1>
<p>Now that you know just what <em>placeholder</em> means, we can define
<em>placeholder expression</em>:</p>
<div class="admonition-definition admonition">
<p class="admonition-title first">Definition</p>
<p>A placeholder expression is either:</p>
<blockquote>
<blockquote>
<ul class="simple">
<li>a placeholder</li>
</ul>
</blockquote>
<p><em>or</em></p>
<blockquote>
<ul class="simple">
<li>a template specialization with at least one argument that
is a placeholder expression.</li>
</ul>
</blockquote>
</blockquote>
</div>
<p>In other words, a placeholder expression always involves a
placeholder.</p>
<!-- DWA: I'm still not sure we shouldn't be at least mentioning the
pitfall, but for now it's commented out.
Lambda and Nullary Metafunctions
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The definition of *placeholder expression* above has an interesting
implication: an ordinary nullary metafunction is never a placeholder
expression. In other words, even though ``add_pointer<int>`` is a
nullary metafunction, it won't be invoked in the expression below;
the assertion will always fail:
.. parsed-literal::
BOOST_STATIC_ASSERT((
mpl::apply<
boost::is_same<**boost::add_pointer<int>**,_1>
, int\*
>::type::value
));
In order to allow a nullary metafunction to be used as a lambda
expression, MPL provides this definition of ``arg``:
.. parsed-literal::
// primary template definition (not a specialization)
template <class F>
struct arg
{
template <class A1 = void\_, class A2 = void\_, ... class *Am* = void\_>
struct apply : F
{
};
};
When applied to a lambda expression's actual arguments, ``arg<F>``
ignores them and simply returns ``F::type``. In other words, if
``F`` is a nullary metafunction, ``arg<F>`` is a metafunction class
that invokes ``F`` and returns the result. So we can transform
add_pointer<int> into a placeholder and get the desired result
with:
.. parsed-literal::
BOOST_STATIC_ASSERT((
mpl::apply<
boost::is_same<
**mpl::arg<boost::add_pointer<int> >**
, _1
>
, int\*
>::type::value
)); -->
</div>
<div class="footer-separator"></div>
<table class="footer"><tr class="footer"><td class="header-group navigation-bar"><span class="navigation-group"><a href="./placeholders.html" class="navigation-link">Prev</a>&nbsp;<a href="./lambda-and-non.html" class="navigation-link">Next</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./placeholders.html" class="navigation-link">Back</a>&nbsp;<a href="./lambda-and-non.html" class="navigation-link">Along</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./lambda-details.html" class="navigation-link">Up</a>&nbsp;<a href="../index.html" class="navigation-link">Home</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./tutorial_toc.html" class="navigation-link">Full TOC</a></span></td>
</tr></table></body>
</html>