blob: e17233f9077acea00cae066705ba7b421c316fe9 [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Starter Kit</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.0">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Phoenix 2.0">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Phoenix 2.0">
<link rel="prev" href="introduction.html" title="Introduction">
<link rel="next" href="basics.html" title="Basics">
</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="introduction.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="basics.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="phoenix.starter_kit"></a><a class="link" href="starter_kit.html" title="Starter Kit">Starter Kit</a>
</h2></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.values">Values</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.references">References</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.arguments">Arguments</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.composites">Composites</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.lazy_operators">Lazy Operators</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.lazy_statements">Lazy Statements</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.construct__new__delete__casts">Construct,
New, Delete, Casts</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.lazy_functions">Lazy Functions</a></span></dt>
<dt><span class="section"><a href="starter_kit.html#phoenix.starter_kit.more">More</a></span></dt>
</dl></div>
<p>
Most "quick starts" only get you a few blocks from where you are.
From there, you are on your own. Yet, typically, you'd want to get to the next
city. This starter kit shall be as minimal as possible, yet packed as much
power as possible.
</p>
<p>
So you are busy and always on the go. You do not wish to spend a lot of time
studying the library. You wish to be spared the details for later when you
need it. For now, all you need to do is to get up to speed as quickly as possible
and start using the library. If this is the case, this is the right place to
start.
</p>
<p>
This chapter is by no means a thorough discourse of the library. For more information
on Phoenix, please take some time to read the rest of the User's Guide. Yet,
if you just want to use the library quickly, now, this chapter will probably
suffice. Rather than taking you to the details of the library, we shall try
to provide you with annotated exemplars instead. Hopefully, this will get you
into high gear quickly.
</p>
<a name="phoenix.starter_kit.functors_everywhere"></a><h3>
<a name="id826615"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.functors_everywhere">Functors everywhere</a>
</h3>
<p>
Phoenix is built on function objects (functors). The functor is the main building
block. We compose functors to build more complex functors... to build more
complex functors... and so on. Almost everything is a functor.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
Functors are so ubiquitous in Phoenix that, in the manual, the words <span class="emphasis"><em>"functor"</em></span>
and <span class="emphasis"><em>"function"</em></span> are used interchangeably.
</p></td></tr>
</table></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.values"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.values" title="Values">Values</a>
</h3></div></div></div>
<p>
Values are functions! Examples:
</p>
<pre class="programlisting"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span>
<span class="identifier">val</span><span class="special">(</span><span class="string">"Hello, World"</span><span class="special">)</span>
</pre>
<p>
The first evaluates to a nullary function (a function taking no arguments)
that returns an <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="number">3</span></code>. The second evaluates to a nullary function
that returns a <code class="computeroutput"><span class="keyword">char</span> <span class="keyword">const</span><span class="special">(&amp;)[</span><span class="number">13</span><span class="special">]</span></code>, <code class="computeroutput"><span class="string">"Hello,
World"</span></code>.
</p>
<a name="phoenix.starter_kit.values.lazy_evaluation"></a><h3>
<a name="id826742"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.values.lazy_evaluation">Lazy Evaluation</a>
</h3>
<p>
Confused? <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> is a unary
function, you say? Yes it is. However, read carefully: <span class="emphasis"><em>"evaluates
to a nullary function"</em></span>. <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code>
evaluates to (returns) a nullary function. Aha! <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code>
returns a function! So, since <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code>
returns a function, you can invoke it. Example:
</p>
<pre class="programlisting"><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)()</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
(See <a href="../../../example/users_manual/values.cpp" target="_top">values.cpp</a>)
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about values <a class="link" href="primitives.html#phoenix.primitives.values" title="Values">here.</a>
</p>
</div>
<p>
The second function call (the one with no arguments) calls the nullary function
which then returns <code class="computeroutput"><span class="number">3</span></code>. The need
for a second function call is the reason why the function is said to be
<span class="bold"><strong><span class="emphasis"><em>Lazily Evaluated</em></span></strong></span>. The
first call doesn't do anything. You need a second call to finally evaluate
the thing. The first call lazily evaluates the function; i.e. doesn't do
anything and defers the evaluation for later.
</p>
<a name="phoenix.starter_kit.values.callbacks"></a><h3>
<a name="id826932"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.values.callbacks">Callbacks</a>
</h3>
<p>
It may not be immediately apparent how lazy evaluation can be useful by just
looking at the example above. Putting the first and second function call
in a single line is really not very useful. However, thinking of <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> as a callback function (and in most cases
they are actually used that way), will make it clear. Example:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
<span class="keyword">void</span> <span class="identifier">print</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">f</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
<span class="keyword">int</span>
<span class="identifier">main</span><span class="special">()</span>
<span class="special">{</span>
<span class="identifier">print</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">));</span>
<span class="identifier">print</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="string">"Hello World"</span><span class="special">));</span>
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<p>
(See <a href="../../../example/users_manual/callback.cpp" target="_top">callback.cpp</a>)
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.references"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.references" title="References">References</a>
</h3></div></div></div>
<p>
References are functions. They hold a reference to a value stored somewhere.
For example, given:
</p>
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span>
</pre>
<p>
we create <code class="computeroutput"><span class="identifier">references</span></code> to
<code class="computeroutput"><span class="identifier">i</span></code> and <code class="computeroutput"><span class="identifier">s</span></code>
this way:
</p>
<pre class="programlisting"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span>
<span class="identifier">ref</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span>
</pre>
<p>
Like <code class="computeroutput"><span class="identifier">val</span></code>, the expressions
above evaluates to a nullary function; the first one returning an <code class="computeroutput"><span class="keyword">int</span><span class="special">&amp;</span></code>,
and the second one returning a <code class="computeroutput"><span class="keyword">char</span>
<span class="keyword">const</span><span class="special">*&amp;</span></code>.
</p>
<p>
(See <a href="../../../example/users_manual/references.cpp" target="_top">references.cpp</a>)
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about references <a class="link" href="primitives.html#phoenix.primitives.references" title="References">here.</a>
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.arguments"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.arguments" title="Arguments">Arguments</a>
</h3></div></div></div>
<p>
Arguments are also functions? You bet!
</p>
<p>
Until now, we have been dealing with expressions returning a nullary function.
Arguments, on the other hand, evaluate to an N-ary function. An argument
represents the Nth argument. There are a few predefined arguments arg1, arg2,
arg3, arg4 and so on (and it's <a href="http://www.boost.org/libs/lambda/doc/index.html" target="_top">BLL</a>
counterparts: _1, _2, _3, _4 and so on). Examples:
</p>
<pre class="programlisting"><span class="identifier">arg1</span> <span class="comment">// one-or-more argument function that returns its first argument
</span><span class="identifier">arg2</span> <span class="comment">// two-or-more argument function that returns its second argument
</span><span class="identifier">arg3</span> <span class="comment">// three-or-more argument function that returns its third argument
</span></pre>
<p>
<code class="computeroutput"><span class="identifier">argN</span></code> returns the Nth argument.
Examples:
</p>
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">arg1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 3
</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">arg2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints "Hello World"
</span></pre>
<p>
(See <a href="../../../example/users_manual/arguments.cpp" target="_top">arguments.cpp</a>)
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about arguments <a class="link" href="primitives.html#phoenix.primitives.arguments" title="Arguments">here.</a>
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.composites"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.composites" title="Composites">Composites</a>
</h3></div></div></div>
<p>
What we have seen so far, are what are called <span class="bold"><strong>primitives</strong></span>.
You can think of primitives (such as values, references and arguments) as
atoms.
</p>
<p>
Things start to get interesting when we start <span class="emphasis"><em>composing</em></span>
primitives to form <span class="bold"><strong>composites</strong></span>. The composites
can, in turn, be composed to form even more complex composites.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.lazy_operators"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_operators" title="Lazy Operators">Lazy Operators</a>
</h3></div></div></div>
<p>
You can use the usual set of operators to form composites. Examples:
</p>
<pre class="programlisting"><span class="identifier">arg1</span> <span class="special">*</span> <span class="identifier">arg1</span>
<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">z</span><span class="special">)</span>
<span class="identifier">arg1</span> <span class="special">=</span> <span class="identifier">arg2</span> <span class="special">+</span> <span class="special">(</span><span class="number">3</span> <span class="special">*</span> <span class="identifier">arg3</span><span class="special">)</span>
<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">arg1</span><span class="special">[</span><span class="identifier">arg2</span><span class="special">]</span> <span class="comment">// assuming arg1 is indexable and arg2 is a valid index
</span></pre>
<p>
Note the expression: <code class="computeroutput"><span class="number">3</span> <span class="special">*</span>
<span class="identifier">arg3</span></code>. This expression is actually
a short-hand equivalent to: <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span>
<span class="special">*</span> <span class="identifier">arg3</span></code>.
In most cases, like above, you can get away with it. But in some cases, you
will have to explicitly wrap your values in <code class="computeroutput"><span class="identifier">val</span></code>.
Rules of thumb:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
In a binary expression (e.g. <code class="computeroutput"><span class="number">3</span>
<span class="special">*</span> <span class="identifier">arg3</span></code>),
at least one of the operands must be a phoenix primitive or composite.
</li>
<li class="listitem">
In a unary expression (e.g. <code class="computeroutput"><span class="identifier">arg1</span><span class="special">++</span></code>), the single operand must be a phoenix
primitive or composite.
</li>
</ul></div>
<p>
If these basic rules are not followed, the result is either in error, or
is immediately evaluated. Some examples:
</p>
<pre class="programlisting"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">123</span> <span class="comment">// lazy
</span><span class="identifier">x</span> <span class="special">=</span> <span class="number">123</span> <span class="comment">// immediate
</span>
<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="comment">// lazy
</span><span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="comment">// immediate
</span>
<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)]</span> <span class="comment">// lazy
</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="identifier">i</span><span class="special">]</span> <span class="comment">// lazy (equivalent to ref(x)[val(i)])
</span><span class="identifier">x</span><span class="special">[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)]</span> <span class="comment">// illegal (x is not a phoenix primitive or composite)
</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)])</span> <span class="comment">// illegal (x is not a phoenix primitive or composite)
</span></pre>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about operators <a class="link" href="composite.html#phoenix.composite.operator" title="Operator">here.</a>
</p>
</div>
<a name="phoenix.starter_kit.lazy_operators.first_practical_example"></a><h3>
<a name="id830876"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_operators.first_practical_example">First
Practical Example</a>
</h3>
<p>
We've covered enough ground to present a real world example. We want to find
the first odd number in an STL container. Normally we use a functor (function
object) or a function pointer and pass that in to STL's <code class="computeroutput"><span class="identifier">find_if</span></code>
generic function:
</p>
<p>
Write a function:
</p>
<pre class="programlisting"><span class="keyword">bool</span>
<span class="identifier">is_odd</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">arg1</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>
</pre>
<p>
Pass a pointer to the function to STL's <code class="computeroutput"><span class="identifier">find_if</span></code>
algorithm:
</p>
<pre class="programlisting"><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">is_odd</span><span class="special">)</span>
</pre>
<p>
Using Phoenix, the same can be achieved directly with a one-liner:
</p>
<pre class="programlisting"><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span>
</pre>
<p>
The expression <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">%</span>
<span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> auto-magically creates a functor with the
expected behavior. In FP, this unnamed function is called a lambda function.
Unlike the function pointer version, which is monomorphic (expects and works
only with a fixed type int argument), the Phoenix version is fully polymorphic
and works with any container (of ints, of longs, of bignum, etc.) as long
as its elements can handle the <code class="computeroutput"><span class="identifier">arg1</span>
<span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> expression.
</p>
<p>
(See <a href="../../../example/users_manual/find_if.cpp" target="_top">find_if.cpp</a>)
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> ...<span class="bold"><strong>That's it, we're done</strong></span>.
Well if you wish to know a little bit more, read on...
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.lazy_statements"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_statements" title="Lazy Statements">Lazy Statements</a>
</h3></div></div></div>
<p>
Lazy statements? Sure. There are lazy versions of the C++ statements we all
know and love. For example:
</p>
<pre class="programlisting"><span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">&gt;</span> <span class="number">5</span><span class="special">)</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">arg1</span>
</pre>
<p>
Say, for example, we wish to print all the elements that are greater than
5 (separated by a comma) in a vector. Here's how we write it:
</p>
<pre class="programlisting"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
<span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">&gt;</span> <span class="number">5</span><span class="special">)</span>
<span class="special">[</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">arg1</span> <span class="special">&lt;&lt;</span> <span class="string">", "</span>
<span class="special">]</span>
<span class="special">);</span>
</pre>
<p>
(See <a href="../../../example/users_manual/if.cpp" target="_top">if.cpp</a>)
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about statements <a class="link" href="composite.html#phoenix.composite.statement" title="Statement">here.</a>
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.construct__new__delete__casts"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.construct__new__delete__casts" title="Construct, New, Delete, Casts">Construct,
New, Delete, Casts</a>
</h3></div></div></div>
<p>
You'll probably want to work with objects. There are lazy versions of constructor
calls, <code class="computeroutput"><span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">delete</span></code>
and the suite of C++ casts. Examples:
</p>
<pre class="programlisting"><span class="identifier">construct</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// constructs a std::string from arg1, arg2
</span><span class="identifier">new_</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// makes a new std::string from arg1, arg2
</span><span class="identifier">delete_</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// deletes arg1 (assumed to be a pointer)
</span><span class="identifier">static_cast_</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">*&gt;(</span><span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// static_cast's arg1 to an int*
</span></pre>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
Take note that, by convention, names that conflict with C++ reserved words
are appended with a single trailing underscore <code class="computeroutput"><span class="char">'_'</span></code>
</p></td></tr>
</table></div>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Learn more about this <a class="link" href="composite.html#phoenix.composite.object" title="Object">here.</a>
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.lazy_functions"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_functions" title="Lazy Functions">Lazy Functions</a>
</h3></div></div></div>
<p>
As you write more lambda functions, you'll notice certain patterns that you
wish to refactor as reusable functions. When you reach that point, you'll
wish that ordinary functions can co-exist with phoenix functions. Unfortunately,
the <span class="emphasis"><em>immediate</em></span> nature of plain C++ functions make them
incompatible.
</p>
<p>
Lazy functions are your friends. The library provides a facility to make
lazy functions. The code below is a rewrite of the <code class="computeroutput"><span class="identifier">is_odd</span></code>
function using the facility:
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">is_odd_impl</span>
<span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Arg</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">result</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="keyword">bool</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">Arg</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Arg</span> <span class="identifier">arg1</span><span class="special">)</span> <span class="keyword">const</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">arg1</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="special">};</span>
<span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">is_odd_impl</span><span class="special">&gt;</span> <span class="identifier">is_odd</span><span class="special">;</span>
</pre>
<a name="phoenix.starter_kit.lazy_functions.things_to_note_"></a><h3>
<a name="id831842"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_functions.things_to_note_">Things
to note:</a>
</h3>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<code class="computeroutput"><span class="identifier">result</span></code> is a nested metafunction
that reflects the return type of the function (in this case, bool). This
makes the function fully polymorphic: It can work with arbitrary <code class="computeroutput"><span class="identifier">Arg</span></code> types.
</li>
<li class="listitem">
There are as many Args in the <code class="computeroutput"><span class="identifier">result</span></code>
metafunction as in the actual <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">is_odd_impl</span></code> implements
the function.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">is_odd</span></code>, an instance of
<code class="computeroutput"><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">is_odd_impl</span><span class="special">&gt;</span></code>,
is the lazy function.
</li>
</ul></div>
<p>
Now, <code class="computeroutput"><span class="identifier">is_odd</span></code> is a truly lazy
function that we can use in conjunction with the rest of phoenix. Example:
</p>
<pre class="programlisting"><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">is_odd</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">));</span>
</pre>
<p>
(See <a href="../../../example/users_manual/function.cpp" target="_top">function.cpp</a>)
</p>
<a name="phoenix.starter_kit.lazy_functions.predefined_lazy_functions"></a><h3>
<a name="id832032"></a>
<a class="link" href="starter_kit.html#phoenix.starter_kit.lazy_functions.predefined_lazy_functions">Predefined
Lazy Functions</a>
</h3>
<p>
The library is chock full of STL savvy, predefined lazy functions covering
the whole of the STL containers, iterators and algorithms. For example, there
are lazy versions of container related operations such as assign, at, back,
begin, pop_back, pop_front, push_back, push_front, etc. (See <a class="link" href="container.html" title="Container">Container</a>).
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="phoenix.starter_kit.more"></a><a class="link" href="starter_kit.html#phoenix.starter_kit.more" title="More">More</a>
</h3></div></div></div>
<p>
As mentioned earlier, this chapter is not a thorough discourse of the library.
It is meant only to cover enough ground to get you into high gear as quickly
as possible. Some advanced stuff is not discussed here (e.g. <a class="link" href="composite.html#phoenix.composite.scope" title="Scope">Scopes</a>);
nor are features that provide alternative (short-hand) ways to do the same
things (e.g. <a class="link" href="composite.html#phoenix.composite.bind" title="Bind">Bind</a> vs. Lazy
Functions).
</p>
<div class="sidebar">
<p class="title"><b></b></p>
<p>
<span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> ...<span class="bold"><strong>If you still wish to learn
more, the read on...</strong></span>
</p>
</div>
</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; 2002-2005 Joel
de Guzman, Dan Marsden<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="introduction.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="basics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>