1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Struct template default_eval</title> 6<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../../../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../../../proto/reference.html#header.boost.proto.context.default_hpp" title="Header <boost/proto/context/default.hpp>"> 10<link rel="prev" href="callable_context/eval.html" title="Struct template eval"> 11<link rel="next" href="default_context.html" title="Struct default_context"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> 16<td align="center"><a href="../../../../../index.html">Home</a></td> 17<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="callable_context/eval.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../proto/reference.html#header.boost.proto.context.default_hpp"><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="default_context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="refentry"> 27<a name="boost.proto.context.default_eval"></a><div class="titlepage"></div> 28<div class="refnamediv"> 29<h2><span class="refentrytitle">Struct template default_eval</span></h2> 30<p>boost::proto::context::default_eval — 31 A BinaryFunction that accepts a Proto expression and a context, evaluates 32 each child expression with the context, and combines the result using the 33 standard C++ meaning for the operator represented by the current expression 34 node. 35 </p> 36</div> 37<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2> 38<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../../../proto/reference.html#header.boost.proto.context.default_hpp" title="Header <boost/proto/context/default.hpp>">boost/proto/context/default.hpp</a>> 39 40</span><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <a class="link" href="../../../Expr.html" title="Concept Expr">Expr</a><span class="special">,</span> <span class="keyword">typename</span> Context<span class="special">></span> 41<span class="keyword">struct</span> <a class="link" href="default_eval.html" title="Struct template default_eval">default_eval</a> <span class="special">{</span> 42 <span class="comment">// <a class="link" href="default_eval.html#boost.proto.context.default_evaltypes">types</a></span> 43 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">::</span><span class="identifier">tag_type</span> <a name="boost.proto.context.default_eval.Tag"></a><span class="identifier">Tag</span><span class="special">;</span> <span class="comment">// For exposition only</span> 44 <span class="keyword">typedef</span> <span class="emphasis"><em><span class="identifier">see</span><span class="special">-</span><span class="identifier">below</span></em></span> <a class="link" href="default_eval.html#boost.proto.context.default_eval.result_type"><span class="identifier">result_type</span></a><span class="special">;</span> 45 46 <span class="comment">// <a class="link" href="default_eval.html#id-1_3_33_5_55_1_1_1_1_8-bb">public member functions</a></span> 47 <span class="identifier">result_type</span> <a class="link" href="default_eval.html#id-1_3_33_5_55_1_1_1_1_8_1-bb"><span class="keyword">operator</span><span class="special">(</span><span class="special">)</span></a><span class="special">(</span><span class="identifier">Expr</span> <span class="special">&</span><span class="special">,</span> <span class="identifier">Context</span> <span class="special">&</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 48 49 <span class="comment">// public data members</span> 50 <span class="keyword">static</span> <span class="identifier">Expr</span> <span class="special">&</span> <span class="identifier">s_expr</span><span class="special">;</span> <span class="comment">// For exposition only</span> 51 <span class="keyword">static</span> <span class="identifier">Context</span> <span class="special">&</span> <span class="identifier">s_context</span><span class="special">;</span> <span class="comment">// For exposition only</span> 52<span class="special">}</span><span class="special">;</span></pre></div> 53<div class="refsect1"> 54<a name="id-1.3.33.5.57.3.4"></a><h2>Description</h2> 55<p> 56 Let <code class="computeroutput"><code class="computeroutput">OP</code></code> be the C++ operator 57 corresponding to <code class="computeroutput">Expr::proto_tag</code>. (For example, if 58 <code class="computeroutput">Tag</code> is <code class="computeroutput"> 59 <a class="link" href="../tag/plus.html" title="Struct plus">proto::tag::plus</a></code>, let <code class="computeroutput"> 60 <code class="computeroutput">OP</code></code> be <code class="computeroutput">+</code>.) 61 </p> 62<p> 63 The behavior of this class is specified in terms of the C++0x <code class="computeroutput">decltype</code> 64 keyword. In systems where this keyword is not available, Proto uses the Boost.Typeof library to 65 approximate the behavior. 66 </p> 67<div class="refsect2"> 68<a name="id-1.3.33.5.57.3.4.4"></a><h3> 69<a name="boost.proto.context.default_evaltypes"></a><code class="computeroutput">default_eval</code> 70 public 71 types</h3> 72<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"> 73<p> 74<span class="keyword">typedef</span> <span class="emphasis"><em><span class="identifier">see</span><span class="special">-</span><span class="identifier">below</span></em></span> <a name="boost.proto.context.default_eval.result_type"></a><span class="identifier">result_type</span><span class="special">;</span></p> 75<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 76<li class="listitem"> 77<p> 78 If <code class="computeroutput">Tag</code> corresponds to a unary prefix operator, 79 then the result type is 80 </p> 81<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 82 <span class="identifier">OP</span> <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child.html" title="Function child">proto::child</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> 83<span class="special">)</span></pre> 84<p> 85 </p> 86</li> 87<li class="listitem"> 88<p> 89 If <code class="computeroutput">Tag</code> corresponds to a unary postfix operator, 90 then the result type is 91 </p> 92<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 93 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child.html" title="Function child">proto::child</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="identifier">OP</span> 94<span class="special">)</span></pre> 95<p> 96 </p> 97</li> 98<li class="listitem"> 99<p> 100 If <code class="computeroutput">Tag</code> corresponds to a binary infix operator, 101 then the result type is 102 </p> 103<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 104 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../left.html" title="Function left">proto::left</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="identifier">OP</span> 105 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../right.html" title="Function right">proto::right</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> 106<span class="special">)</span></pre> 107<p> 108 </p> 109</li> 110<li class="listitem"> 111<p> 112 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 113 <a class="link" href="../tag/subscript.html" title="Struct subscript">proto::tag::subscript</a> 114 </code>, 115 then the result type is 116 </p> 117<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 118 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../left.html" title="Function left">proto::left</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">[</span> 119 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../right.html" title="Function right">proto::right</a><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">]</span> 120<span class="special">)</span></pre> 121<p> 122 </p> 123</li> 124<li class="listitem"> 125<p> 126 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 127 <a class="link" href="../tag/if_else_.html" title="Struct if_else_">proto::tag::if_else_</a> 128 </code>, 129 then the result type is 130 </p> 131<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 132 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="number">0</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">?</span> 133 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="number">1</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">:</span> 134 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="number">2</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> 135<span class="special">)</span></pre> 136<p> 137 </p> 138</li> 139<li class="listitem"> 140<p> 141 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 142 <a class="link" href="../tag/function.html" title="Struct function">proto::tag::function</a> 143 </code>, 144 then the result type is 145 </p> 146<pre class="programlisting"><span class="keyword">decltype</span><span class="special">(</span> 147 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="number">0</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">(</span> 148 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="number">1</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span><span class="special">,</span> 149 <span class="special">...</span> 150 <a class="link" href="../eval.html" title="Function eval">proto::eval</a><span class="special">(</span><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a><span class="special"><</span><span class="identifier">N</span><span class="special">></span><span class="special">(</span><span class="identifier">s_expr</span><span class="special">)</span><span class="special">,</span> <span class="identifier">s_context</span><span class="special">)</span> <span class="special">)</span> 151<span class="special">)</span></pre> 152<p> 153 </p> 154</li> 155</ul></div> 156</li></ol></div> 157</div> 158<div class="refsect2"> 159<a name="id-1.3.33.5.57.3.4.5"></a><h3> 160<a name="id-1_3_33_5_55_1_1_1_1_8-bb"></a><code class="computeroutput">default_eval</code> public member functions</h3> 161<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"> 162<pre class="literallayout"><span class="identifier">result_type</span> <a name="id-1_3_33_5_55_1_1_1_1_8_1-bb"></a><span class="keyword">operator</span><span class="special">(</span><span class="special">)</span><span class="special">(</span><span class="identifier">Expr</span> <span class="special">&</span> expr<span class="special">,</span> <span class="identifier">Context</span> <span class="special">&</span> context<span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre> 163<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 164<li class="listitem"> 165<p> 166 If <code class="computeroutput">Tag</code> corresponds to a unary prefix operator, 167 then return 168 </p> 169<pre class="programlisting">OP <code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child.html" title="Function child">proto::child</a></code>(expr), context)</pre> 170<p> 171 </p> 172</li> 173<li class="listitem"> 174<p> 175 If <code class="computeroutput">Tag</code> corresponds to a unary postfix operator, 176 then return 177 </p> 178<pre class="programlisting"><code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child.html" title="Function child">proto::child</a></code>(expr), context) OP</pre> 179<p> 180 </p> 181</li> 182<li class="listitem"> 183<p> 184 If <code class="computeroutput">Tag</code> corresponds to a binary infix operator, 185 then return 186 </p> 187<pre class="programlisting"><code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../left.html" title="Function left">proto::left</a></code>(expr), context) OP 188<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../right.html" title="Function right">proto::right</a></code>(expr), context)</pre> 189<p> 190 </p> 191</li> 192<li class="listitem"> 193<p> 194 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 195 <code class="computeroutput"><a class="link" href="../tag/subscript.html" title="Struct subscript">proto::tag::subscript</a></code> 196 </code>, 197 then return 198 </p> 199<pre class="programlisting"><code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../left.html" title="Function left">proto::left</a></code>(expr), context) [ 200<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../right.html" title="Function right">proto::right</a></code>(expr), context) ]</pre> 201<p> 202 </p> 203</li> 204<li class="listitem"> 205<p> 206 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 207 <code class="computeroutput"><a class="link" href="../tag/if_else_.html" title="Struct if_else_">proto::tag::if_else_</a></code> 208 </code>, 209 then return 210 </p> 211<pre class="programlisting"><code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><0>(expr), context) ? 212<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><1>(expr), context) : 213<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><2>(expr), context)</pre> 214<p> 215 </p> 216</li> 217<li class="listitem"> 218<p> 219 If <code class="computeroutput">Tag</code> is <code class="computeroutput"> 220 <code class="computeroutput"><a class="link" href="../tag/function.html" title="Struct function">proto::tag::function</a></code> 221 </code>, 222 then return 223 </p> 224<pre class="programlisting"><code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><0>(expr), context) ( 225<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><1>(expr), context), 226... 227<code class="computeroutput"><a class="link" href="../eval.html" title="Function eval">proto::eval</a></code>(<code class="computeroutput"><a class="link" href="../child_c.html" title="Function child_c">proto::child_c</a></code><N>(expr), context) )</pre> 228<p> 229 </p> 230</li> 231</ul></div> 232<div class="variablelist"><table border="0" class="variablelist compact"> 233<colgroup> 234<col align="left" valign="top"> 235<col> 236</colgroup> 237<tbody><tr> 238<td><p><span class="term">Parameters:</span></p></td> 239<td><div class="variablelist"><table border="0" class="variablelist compact"> 240<colgroup> 241<col align="left" valign="top"> 242<col> 243</colgroup> 244<tbody> 245<tr> 246<td><p><span class="term"><code class="computeroutput">context</code></span></p></td> 247<td><p>The evaluation context </p></td> 248</tr> 249<tr> 250<td><p><span class="term"><code class="computeroutput">expr</code></span></p></td> 251<td><p>The current expression </p></td> 252</tr> 253</tbody> 254</table></div></td> 255</tr></tbody> 256</table></div> 257</li></ol></div> 258</div> 259</div> 260</div> 261<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 262<td align="left"></td> 263<td align="right"><div class="copyright-footer">Copyright © 2008 Eric Niebler<p> 264 Distributed under the Boost Software License, Version 1.0. (See accompanying 265 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>) 266 </p> 267</div></td> 268</tr></table> 269<hr> 270<div class="spirit-nav"> 271<a accesskey="p" href="callable_context/eval.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../proto/reference.html#header.boost.proto.context.default_hpp"><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="default_context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 272</div> 273</body> 274</html> 275