Files
boost_fusion/doc/html/fusion/functional/adapters/unfused_generic.html
Joel de Guzman d004046aa5 Merge from Trunk
[SVN r49252]
2008-10-10 15:05:47 +00:00

299 lines
21 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>unfused_generic</title>
<link rel="stylesheet" href="../../../../../../../doc/html/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.66.1">
<link rel="start" href="../../../index.html" title="Chapter 1. Fusion 2.0">
<link rel="up" href="../adapters.html" title=" Adapters">
<link rel="prev" href="fused_function_object.html" title="fused_function_object">
<link rel="next" href="unfused_lvalue_args.html" title="unfused_lvalue_args">
</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="../../../../../../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="fused_function_object.html"><img src="../../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../adapters.html"><img src="../../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="unfused_lvalue_args.html"><img src="../../../../../../../doc/html/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="titlepage"><div><div><h4 class="title">
<a name="fusion.functional.adapters.unfused_generic"></a><a href="unfused_generic.html" title="unfused_generic">unfused_generic</a></h4></div></div></div>
<a name="fusion.functional.adapters.unfused_generic.description"></a><h5>
<a name="id666486"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.description">Description</a>
</h5>
<p>
An n-ary <a href="../concepts/poly.html" title=" Polymorphic Function
Object">Polymorphic Function
Object</a> adapter template for an unary <a href="../concepts/poly.html" title=" Polymorphic Function
Object">Polymorphic
Function Object</a> target function. When called, its arguments are
bundled to a <a href="../../sequence/concepts/random_access_sequence.html" title="Random
Access Sequence">Random
Access Sequence</a> of references that is passed to the target function.
Non-const LValue arguments are transported as references to non-const,
otherwise references to const are used.
</p>
<div class="sidebar"><p>
<span class="inlinemediaobject"><img src="../../../images/tip.png" alt="tip"></span> Detecting mutable LValues on a per-argument basis
is currently a compile time expensive operation (see <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_top">The
Forwarding Problem</a> for details). Therefore, there are two, lightweight
and more restricted variants of this class template, <a href="unfused_lvalue_args.html" title="unfused_lvalue_args"><tt class="computeroutput"><span class="identifier">unfused_lvalue_args</span></tt></a> and <a href="unfused_rvalue_args.html" title="unfused_rvalue_args"><tt class="computeroutput"><span class="identifier">unfused_rvalue_args</span></tt></a>.
</p></div>
<p>
The type of the target function is allowed to be const qualified or a reference.
Const qualification is preserved and propagated appropriately (in other
words, only const versions of <tt class="literal">operator()</tt> can be used
if the target function object is const - or, in case the target function
object is held by value, the adapter is const).
</p>
<p>
/functional/adapter/unfused_generic.hpp&gt;
</p>
<a name="fusion.functional.adapters.unfused_generic.synopsis"></a><h5>
<a name="id666643"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.synopsis">Synopsis</a>
</h5>
<pre class="programlisting">
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Function</span><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">unfused_generic</span><span class="special">;</span>
</pre>
<a name="fusion.functional.adapters.unfused_generic.template_parameters"></a><h5>
<a name="id666724"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.template_parameters">Template
parameters</a>
</h5>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Parameter
</p>
</th>
<th>
<p>
Description
</p>
</th>
<th>
<p>
Default
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<tt class="computeroutput"><span class="identifier">Function</span></tt>
</p>
</td>
<td>
<p>
An unary <a href="../concepts/poly.html" title=" Polymorphic Function
Object">Polymorphic
Function Object</a>
</p>
</td>
<td>
<p>
</p>
</td>
</tr></tbody>
</table></div>
<a name="fusion.functional.adapters.unfused_generic.model_of"></a><h5>
<a name="id666840"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.model_of">Model
of</a>
</h5>
<div class="itemizedlist"><ul type="disc">
<li><a href="../concepts/poly.html" title=" Polymorphic Function
Object">Polymorphic Function
Object</a></li>
<li><a href="../concepts/def_callable.html" title=" Deferred
Callable Object">Deferred Callable
Object</a></li>
</ul></div>
<div class="variablelist">
<p class="title"><b>Notation</b></p>
<dl>
<dt><span class="term"><tt class="computeroutput"><span class="identifier">F</span></tt></span></dt>
<dd><p>
A possibly const qualified, unary <a href="../concepts/poly.html" title=" Polymorphic Function
Object">Polymorphic
Function Object</a> type or reference type thereof
</p></dd>
<dt><span class="term"><tt class="computeroutput"><span class="identifier">f</span></tt></span></dt>
<dd><p>
An object convertible to <tt class="computeroutput"><span class="identifier">F</span></tt>
</p></dd>
<dt><span class="term"><tt class="computeroutput"><span class="identifier">UG</span></tt></span></dt>
<dd><p>
The type <tt class="computeroutput"><span class="identifier">unfused_generic</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</span></tt>
</p></dd>
<dt><span class="term"><tt class="computeroutput"><span class="identifier">ug</span></tt></span></dt>
<dd><p>
An instance of <tt class="computeroutput"><span class="identifier">UG</span></tt>,
initialized with <tt class="computeroutput"><span class="identifier">f</span></tt>
</p></dd>
<dt><span class="term"><tt class="computeroutput"><span class="identifier">a0</span></tt>...<tt class="computeroutput"><span class="identifier">aN</span></tt></span></dt>
<dd><p>
Arguments to <tt class="computeroutput"><span class="identifier">ug</span></tt>
</p></dd>
</dl>
</div>
<a name="fusion.functional.adapters.unfused_generic.expression_semantics"></a><h5>
<a name="id667108"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.expression_semantics">Expression
Semantics</a>
</h5>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Expression
</p>
</th>
<th>
<p>
Semantics
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<tt class="computeroutput"><span class="identifier">UG</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></tt>
</p>
</td>
<td>
<p>
Creates a fused function as described above, initializes the target
function with <tt class="computeroutput"><span class="identifier">f</span></tt>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<tt class="computeroutput"><span class="identifier">UG</span><span class="special">()</span></tt>
</p>
</td>
<td>
<p>
Creates a fused function as described above, attempts to use <tt class="computeroutput"><span class="identifier">F</span></tt>'s default constructor.
</p>
</td>
</tr>
<tr>
<td>
<p>
<tt class="computeroutput"><span class="identifier">ug</span><span class="special">(</span><span class="identifier">a0</span></tt>...<tt class="computeroutput"><span class="identifier">aN</span><span class="special">)</span></tt>
</p>
</td>
<td>
<p>
Calls <tt class="computeroutput"><span class="identifier">f</span></tt> with a
<a href="../../sequence.html" title="Sequence">Sequence</a> that contains references
to the arguments <tt class="computeroutput"><span class="identifier">a0</span></tt>...<tt class="computeroutput"><span class="identifier">aN</span></tt>.
</p>
</td>
</tr>
</tbody>
</table></div>
<a name="fusion.functional.adapters.unfused_generic.example"></a><h5>
<a name="id667374"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.example">Example</a>
</h5>
<pre class="programlisting">
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">fused_bound_1st</span>
<span class="special">{</span>
<span class="keyword">typename</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">deduce</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">fnc_deferred</span><span class="special">;</span>
<span class="keyword">typename</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">deduce</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">xxx_bound</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="identifier">fused_bound_1st</span><span class="special">(</span><span class="identifier">Function</span> <span class="identifier">deferred</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">bound</span><span class="special">)</span>
<span class="special">:</span> <span class="identifier">fnc_deferred</span><span class="special">(</span><span class="identifier">deferred</span><span class="special">),</span> <span class="identifier">xxx_bound</span><span class="special">(</span><span class="identifier">bound</span><span class="special">)</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">Sig</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Self</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Seq</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">result</span><span class="special">&lt;</span> <span class="identifier">Self</span><span class="special">(</span><span class="identifier">Seq</span><span class="special">)</span> <span class="special">&gt;</span>
<span class="special">:</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">invoke</span><span class="special">&lt;</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">push_front</span><span class="special">&lt;</span>
<span class="keyword">typename</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">Seq</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span>
<span class="special">{</span> <span class="special">};</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Seq</span><span class="special">&gt;</span>
<span class="keyword">typename</span> <span class="identifier">result</span><span class="special">&lt;</span> <span class="keyword">void</span><span class="special">(</span><span class="identifier">Seq</span><span class="special">)</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Seq</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">s</span><span class="special">)</span> <span class="keyword">const</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">invoke</span><span class="special">(</span><span class="identifier">fnc_deferred</span><span class="special">,</span> <span class="identifier">push_front</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span><span class="identifier">xxx_bound</span><span class="special">));</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">Function</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="identifier">unfused_generic</span><span class="special">&lt;</span> <span class="identifier">fused_bound_1st</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">,</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
<span class="identifier">bind_1st</span><span class="special">(</span><span class="identifier">Function</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">unfused_generic</span><span class="special">&lt;</span> <span class="identifier">fused_bound_1st</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">,</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
<span class="identifier">fused_bound_1st</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">,</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span><span class="identifier">x</span><span class="special">)</span> <span class="special">);</span>
<span class="special">}</span>
<span class="keyword">int</span> <span class="identifier">test_func</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">c</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">+</span><span class="identifier">c</span><span class="special">;</span>
<span class="special">}</span>
<span class="keyword">void</span> <span class="identifier">try_it</span><span class="special">()</span>
<span class="special">{</span>
<span class="identifier">assert</span><span class="special">(</span><span class="identifier">bind_1st</span><span class="special">(&amp;</span> <span class="identifier">test_func</span><span class="special">,</span><span class="number">3</span><span class="special">)(-</span><span class="number">2</span><span class="special">,-</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
<span class="identifier">assert</span><span class="special">(</span><span class="identifier">bind_1st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">&gt;(),</span> <span class="number">1</span><span class="special">)(</span><span class="number">0.5f</span><span class="special">)</span> <span class="special">==</span> <span class="number">1.5f</span><span class="special">);</span>
<span class="special">}</span>
</pre>
<a name="fusion.functional.adapters.unfused_generic.see_also"></a><h5>
<a name="id668770"></a>
<a href="unfused_generic.html#fusion.functional.adapters.unfused_generic.see_also">See
also</a>
</h5>
<div class="itemizedlist"><ul type="disc">
<li><a href="unfused_lvalue_args.html" title="unfused_lvalue_args"><tt class="computeroutput"><span class="identifier">unfused_lvalue_args</span></tt></a></li>
<li><a href="unfused_rvalue_args.html" title="unfused_rvalue_args"><tt class="computeroutput"><span class="identifier">unfused_rvalue_args</span></tt></a></li>
<li><a href="unfused_typed.html" title="unfused_typed"><tt class="computeroutput"><span class="identifier">unfused_typed</span></tt></a></li>
<li><a href="../../support/deduce.html" title="deduce"><tt class="computeroutput"><span class="identifier">deduce</span></tt></a></li>
<li><a href="../../support/deduce_sequence.html" title="deduce_sequence"><tt class="computeroutput"><span class="identifier">deduce_sequence</span></tt></a></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 © 2001-2007 Joel de Guzman, Dan Marsden, Tobias
Schwinger<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="fused_function_object.html"><img src="../../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../adapters.html"><img src="../../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="unfused_lvalue_args.html"><img src="../../../../../../../doc/html/images/next.png" alt="Next"></a>
</div>
</body>
</html>