1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Struct template callable_context</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../../../proto/reference.html#header.boost.proto.context.callable_hpp" title="Header <boost/proto/context/callable.hpp>">
<link rel="prev" href="callable_eval.html" title="Struct template callable_eval">
<link rel="next" href="callable_context/eval.html" title="Struct template eval">
</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="callable_eval.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../proto/reference.html#header.boost.proto.context.callable_hpp"><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="callable_context/eval.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
</div>
<div class="refentry" title="Struct template callable_context">
<a name="boost.proto.context.callable_context"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Struct template callable_context</span></h2>
<p>boost::proto::context::callable_context — An evaluation context adaptor that makes authoring a context a simple matter of
writing function overloads, rather then writing template specializations.</p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="emphasis"><em>// In header: <<a class="link" href="../../../proto/reference.html#header.boost.proto.context.callable_hpp" title="Header <boost/proto/context/callable.hpp>">boost/proto/context/callable.hpp</a>>
</em></span><span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> Context,
<span class="bold"><strong>typename</strong></span> DefaultCtx = <a class="link" href="default_context.html" title="Struct default_context">proto::context::default_context</a>>
<span class="bold"><strong>struct</strong></span> <a class="link" href="callable_context.html" title="Struct template callable_context">callable_context</a> {
<span class="emphasis"><em>// member classes/structs/unions</em></span>
<span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> Expr, <span class="bold"><strong>typename</strong></span> ThisContext = Context>
<span class="bold"><strong>struct</strong></span> <a class="link" href="callable_context/eval.html" title="Struct template eval">eval</a> : <span class="bold"><strong></strong></span> <span class="type"><em class="replaceable"><code>see-below</code></em></span> {
};
};</pre></div>
<div class="refsect1" title="Description">
<a name="id1679388"></a><h2>Description</h2>
<p>
<code class="computeroutput">proto::callable_context<></code> is a base class that
implements the context protocol by passing fanned-out expression nodes to the derived
context, making it easy to customize the handling of expression types by writing function
overloads. Only those expression types needing special handling require explicit handling.
All others are dispatched to a user-specified default context,
<code class="computeroutput">DefaultCtx</code>.
</p>
<p>
<code class="computeroutput">proto::callable_context<></code> is defined simply as:
</p>
<p>
</p>
<pre class="programlisting">template<typename Context, typename DefaultCtx = default_context>
struct callable_context {
template<typename Expr, typename ThisContext = Context>
struct eval :
mpl::if_<
is_expr_handled_<Expr, Context>, // For exposition
<a class="link" href="callable_eval.html" title="Struct template callable_eval">proto::context::callable_eval</a><Expr, ThisContext>,
typename DefaultCtx::template eval<Expr, Context>
>::type
{};
};</pre>
<p>
</p>
<p>
The Boolean metafunction <code class="computeroutput">is_expr_handled_<></code> uses
metaprogramming tricks to determine whether <code class="computeroutput">Context</code> has
an overloaded function call operator that accepts the fanned-out constituents of an
expression of type <code class="computeroutput">Expr</code>. If so, the handling of the
expression is dispatched to
<code class="computeroutput"><a class="link" href="callable_eval.html" title="Struct template callable_eval">proto::context::callable_eval<></a></code>.
If not, it is dispatched to the user-specified <code class="computeroutput">DefaultCtx</code>.
</p>
<p>
<span class="bold"><strong>Example:</strong></span>
</p>
<p>
</p>
<pre class="programlisting">// An evaluation context that increments all
// integer terminals in-place.
struct increment_ints :
<a class="link" href="callable_context.html" title="Struct template callable_context">proto::context::callable_context</a><
increment_ints const // derived context
<a class="link" href="null_context.html" title="Struct null_context">proto::context::null_context</a> const // fall-back context
>
{
typedef void result_type;
// Handle int terminals here:
void operator()(proto::tag::terminal, int &i) const
{
++i;
}
};</pre>
<p>
</p>
<p>
With <code class="computeroutput">increment_ints</code>, we can do the following:
</p>
<p>
</p>
<pre class="programlisting"><a class="link" href="../literal.html" title="Struct template literal">proto::literal</a><int> i = 0, j = 10;
proto::eval( i - j * 3.14, increment_ints() );
assert( i.get() == 1 && j.get() == 11 );</pre>
<p>
</p>
</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 © 2008 Eric Niebler<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="callable_eval.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../proto/reference.html#header.boost.proto.context.callable_hpp"><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="callable_context/eval.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
</div>
</body>
</html>
|