File: callable_context.html

package info (click to toggle)
boost1.42 1.42.0-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 277,864 kB
  • ctags: 401,076
  • sloc: cpp: 1,235,659; xml: 74,142; ansic: 41,313; python: 26,756; sh: 11,840; cs: 2,118; makefile: 655; perl: 494; yacc: 456; asm: 353; csh: 6
file content (129 lines) | stat: -rwxr-xr-x 8,125 bytes parent folder | download
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 &lt;boost/proto/context/callable.hpp&gt;">
<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 &#8212; 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: &lt;<a class="link" href="../../../proto/reference.html#header.boost.proto.context.callable_hpp" title="Header &lt;boost/proto/context/callable.hpp&gt;">boost/proto/context/callable.hpp</a>&gt;

</em></span><span class="bold"><strong>template</strong></span>&lt;<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>&gt; 
<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>&lt;<span class="bold"><strong>typename</strong></span> Expr, <span class="bold"><strong>typename</strong></span> ThisContext = Context&gt; 
  <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&lt;&gt;</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&lt;&gt;</code> is defined simply as:
            </p>
<p>
              </p>
<pre class="programlisting">template&lt;typename Context, typename DefaultCtx = default_context&gt;
struct callable_context {
  template&lt;typename Expr, typename ThisContext = Context&gt;
  struct eval :
    mpl::if_&lt;
      is_expr_handled_&lt;Expr, Context&gt;, // For exposition
      <a class="link" href="callable_eval.html" title="Struct template callable_eval">proto::context::callable_eval</a>&lt;Expr, ThisContext&gt;,
      typename DefaultCtx::template eval&lt;Expr, Context&gt;
    &gt;::type
  {};
};</pre>
<p>
            </p>
<p>
              The Boolean metafunction <code class="computeroutput">is_expr_handled_&lt;&gt;</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&lt;&gt;</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>&lt;
    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
  &gt;
{
    typedef void result_type;

    // Handle int terminals here:
    void operator()(proto::tag::terminal, int &amp;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>&lt;int&gt; i = 0, j = 10;
proto::eval( i - j * 3.14, increment_ints() );

assert( i.get() == 1 &amp;&amp; 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 &#169; 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>