• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Real Number Parsers (float_, double_, etc.)</title>
5<link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../../../index.html" title="Spirit 2.5.8">
8<link rel="up" href="../numeric.html" title="Numeric Parsers">
9<link rel="prev" href="int.html" title="Signed Integer Parsers (int_, etc.)">
10<link rel="next" href="boolean.html" title="Boolean Parser (bool_)">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="int.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric.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="boolean.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h5 class="title">
27<a name="spirit.qi.reference.numeric.real"></a><a class="link" href="real.html" title="Real Number Parsers (float_, double_, etc.)">Real Number Parsers
28          (<code class="computeroutput"><span class="identifier">float_</span></code>, <code class="computeroutput"><span class="identifier">double_</span></code>, etc.)</a>
29</h5></div></div></div>
30<h6>
31<a name="spirit.qi.reference.numeric.real.h0"></a>
32            <span class="phrase"><a name="spirit.qi.reference.numeric.real.description"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.description">Description</a>
33          </h6>
34<p>
35            The <code class="computeroutput"><span class="identifier">real_parser</span></code> can parse
36            real numbers of arbitrary length and size limited by its template parameter,
37            <code class="computeroutput"><span class="identifier">T</span></code>. The numeric base type
38            <code class="computeroutput"><span class="identifier">T</span></code> can be a user defined
39            numeric type such as fixed_point (fixed point reals) and bignum (unlimited
40            precision numbers) as long as the type follows certain expression requirements
41            (documented below).
42          </p>
43<h6>
44<a name="spirit.qi.reference.numeric.real.h1"></a>
45            <span class="phrase"><a name="spirit.qi.reference.numeric.real.header"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.header">Header</a>
46          </h6>
47<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/qi/numeric/real.hpp&gt;</span>
48<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi_real</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
49</pre>
50<p>
51            Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
52          </p>
53<h6>
54<a name="spirit.qi.reference.numeric.real.h2"></a>
55            <span class="phrase"><a name="spirit.qi.reference.numeric.real.namespace"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.namespace">Namespace</a>
56          </h6>
57<div class="informaltable"><table class="table">
58<colgroup><col></colgroup>
59<thead><tr><th>
60                    <p>
61                      Name
62                    </p>
63                  </th></tr></thead>
64<tbody>
65<tr><td>
66                    <p>
67                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">lit</span> <span class="comment">// alias:
68                      boost::spirit::qi::lit</span></code>
69                    </p>
70                  </td></tr>
71<tr><td>
72                    <p>
73                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">float_</span> <span class="comment">//
74                      alias: boost::spirit::qi::float_</span></code>
75                    </p>
76                  </td></tr>
77<tr><td>
78                    <p>
79                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">double_</span> <span class="comment">//
80                      alias: boost::spirit::qi::double_</span></code>
81                    </p>
82                  </td></tr>
83<tr><td>
84                    <p>
85                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">long_double</span> <span class="comment">//
86                      alias: boost::spirit::qi::long_double</span></code>
87                    </p>
88                  </td></tr>
89</tbody>
90</table></div>
91<div class="note"><table border="0" summary="Note">
92<tr>
93<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
94<th align="left">Note</th>
95</tr>
96<tr><td align="left" valign="top"><p>
97              <code class="computeroutput"><span class="identifier">lit</span></code> is reused by the
98              <a class="link" href="../char/char.html" title="Character Parser (char_, lit)">Character Parsers</a>,
99              and the Numeric Parsers. In general, a char parser is created when
100              you pass in a character, and a numeric parser is created when you use
101              a numeric literal.
102            </p></td></tr>
103</table></div>
104<h6>
105<a name="spirit.qi.reference.numeric.real.h3"></a>
106            <span class="phrase"><a name="spirit.qi.reference.numeric.real.synopsis"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.synopsis">Synopsis</a>
107          </h6>
108<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealPolicies</span><span class="special">&gt;</span>
109<span class="keyword">struct</span> <span class="identifier">real_parser</span><span class="special">;</span>
110</pre>
111<h6>
112<a name="spirit.qi.reference.numeric.real.h4"></a>
113            <span class="phrase"><a name="spirit.qi.reference.numeric.real.template_parameters"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.template_parameters">Template
114            parameters</a>
115          </h6>
116<div class="informaltable"><table class="table">
117<colgroup>
118<col>
119<col>
120<col>
121</colgroup>
122<thead><tr>
123<th>
124                    <p>
125                      Parameter
126                    </p>
127                  </th>
128<th>
129                    <p>
130                      Description
131                    </p>
132                  </th>
133<th>
134                    <p>
135                      Default
136                    </p>
137                  </th>
138</tr></thead>
139<tbody>
140<tr>
141<td>
142                    <p>
143                      <code class="computeroutput"><span class="identifier">T</span></code>
144                    </p>
145                  </td>
146<td>
147                    <p>
148                      The numeric base type of the numeric parser.
149                    </p>
150                  </td>
151<td>
152                    <p>
153                      none
154                    </p>
155                  </td>
156</tr>
157<tr>
158<td>
159                    <p>
160                      <code class="computeroutput"><span class="identifier">RealPolicies</span></code>
161                    </p>
162                  </td>
163<td>
164                    <p>
165                      Policies control the parser's behavior.
166                    </p>
167                  </td>
168<td>
169                    <p>
170                      <code class="computeroutput"><span class="identifier">real_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
171                    </p>
172                  </td>
173</tr>
174</tbody>
175</table></div>
176<h6>
177<a name="spirit.qi.reference.numeric.real.h5"></a>
178            <span class="phrase"><a name="spirit.qi.reference.numeric.real.model_of"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.model_of">Model
179            of</a>
180          </h6>
181<div class="blockquote"><blockquote class="blockquote"><p>
182              <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a>
183            </p></blockquote></div>
184<div class="variablelist">
185<p class="title"><b>Notation</b></p>
186<dl class="variablelist">
187<dt><span class="term"><code class="computeroutput"><span class="identifier">n</span></code></span></dt>
188<dd><p>
189                  An object of <code class="computeroutput"><span class="identifier">T</span></code>,
190                  the numeric base type.
191                </p></dd>
192<dt><span class="term"><code class="computeroutput"><span class="identifier">num</span></code></span></dt>
193<dd><p>
194                  Numeric literal, any real value, or a <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy
195                  Argument</a> that evaluates to a real value.
196                </p></dd>
197<dt><span class="term"><code class="computeroutput"><span class="identifier">RP</span></code></span></dt>
198<dd><p>
199                  A <code class="computeroutput"><span class="identifier">RealPolicies</span></code>
200                  (type).
201                </p></dd>
202<dt><span class="term"><code class="computeroutput"><span class="identifier">exp</span></code></span></dt>
203<dd><p>
204                  A <code class="computeroutput"><span class="keyword">int</span></code> exponent.
205                </p></dd>
206<dt><span class="term"><code class="computeroutput"><span class="identifier">b</span></code></span></dt>
207<dd><p>
208                  A <code class="computeroutput"><span class="keyword">bool</span></code> flag.
209                </p></dd>
210<dt><span class="term"><code class="computeroutput"><span class="identifier">f</span></code>, <code class="computeroutput"><span class="identifier">l</span></code></span></dt>
211<dd><p>
212                  <a href="http://en.cppreference.com/w/cpp/named_req/ForwardIterator" target="_top"><code class="computeroutput"><span class="identifier">ForwardIterator</span></code></a>. first/last
213                  iterator pair.
214                </p></dd>
215</dl>
216</div>
217<h6>
218<a name="spirit.qi.reference.numeric.real.h6"></a>
219            <span class="phrase"><a name="spirit.qi.reference.numeric.real.expression_semantics"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.expression_semantics">Expression
220            Semantics</a>
221          </h6>
222<p>
223            Semantics of an expression is defined only where it differs from, or
224            is not defined in <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a>.
225          </p>
226<div class="informaltable"><table class="table">
227<colgroup>
228<col>
229<col>
230</colgroup>
231<thead><tr>
232<th>
233                    <p>
234                      Expression
235                    </p>
236                  </th>
237<th>
238                    <p>
239                      Semantics
240                    </p>
241                  </th>
242</tr></thead>
243<tbody>
244<tr>
245<td>
246                    <p>
247</p>
248<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">float_</span>
249<span class="identifier">double_</span>
250<span class="identifier">long_double</span>
251</pre>
252<p>
253                    </p>
254                  </td>
255<td>
256                    <p>
257                      Parse a real using the default policies (<code class="computeroutput"><span class="identifier">real_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>).
258                    </p>
259                  </td>
260</tr>
261<tr>
262<td>
263                    <p>
264</p>
265<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">lit</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
266<span class="identifier">float_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
267<span class="identifier">double_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
268<span class="identifier">long_double</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
269</pre>
270<p>
271                    </p>
272                  </td>
273<td>
274                    <p>
275                      Match the literal <code class="computeroutput"><span class="identifier">num</span></code>
276                      using the default policies (<code class="computeroutput"><span class="identifier">real_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>). The parser will fail
277                      if the parsed value is not equal to the specified value.
278                    </p>
279                  </td>
280</tr>
281<tr>
282<td>
283                    <p>
284</p>
285<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special">&lt;</span>
286    <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span>
287<span class="special">&gt;()</span>
288</pre>
289<p>
290                    </p>
291                  </td>
292<td>
293                    <p>
294                      Parse a real of type <code class="computeroutput"><span class="identifier">T</span></code>
295                      using <code class="computeroutput"><span class="identifier">RealPolicies</span></code>.
296                    </p>
297                  </td>
298</tr>
299<tr>
300<td>
301                    <p>
302</p>
303<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special">&lt;</span>
304    <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span>
305<span class="special">&gt;()(</span><span class="identifier">num</span><span class="special">)</span>
306</pre>
307<p>
308                    </p>
309                  </td>
310<td>
311                    <p>
312                      Match the literal <code class="computeroutput"><span class="identifier">num</span></code>
313                      of type <code class="computeroutput"><span class="identifier">T</span></code> using
314                      <code class="computeroutput"><span class="identifier">RealPolicies</span></code>.
315                      The parser will fail if the parsed value is not equal to the
316                      specified value.
317                    </p>
318                  </td>
319</tr>
320</tbody>
321</table></div>
322<h6>
323<a name="spirit.qi.reference.numeric.real.h7"></a>
324            <span class="phrase"><a name="spirit.qi.reference.numeric.real.attributes"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.attributes">Attributes</a>
325          </h6>
326<div class="informaltable"><table class="table">
327<colgroup>
328<col>
329<col>
330</colgroup>
331<thead><tr>
332<th>
333                    <p>
334                      Expression
335                    </p>
336                  </th>
337<th>
338                    <p>
339                      Attribute
340                    </p>
341                  </th>
342</tr></thead>
343<tbody>
344<tr>
345<td>
346                    <p>
347</p>
348<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">lit</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
349</pre>
350<p>
351                    </p>
352                  </td>
353<td>
354                    <p>
355                      <code class="computeroutput"><span class="identifier">unused</span></code>
356                    </p>
357                  </td>
358</tr>
359<tr>
360<td>
361                    <p>
362</p>
363<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">float_</span>
364<span class="identifier">float_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
365</pre>
366<p>
367                    </p>
368                  </td>
369<td>
370                    <p>
371                      <code class="computeroutput"><span class="keyword">float</span></code>
372                    </p>
373                  </td>
374</tr>
375<tr>
376<td>
377                    <p>
378</p>
379<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">double_</span>
380<span class="identifier">double_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
381</pre>
382<p>
383                    </p>
384                  </td>
385<td>
386                    <p>
387                      <code class="computeroutput"><span class="keyword">double</span></code>
388                    </p>
389                  </td>
390</tr>
391<tr>
392<td>
393                    <p>
394</p>
395<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">long_double</span>
396<span class="identifier">long_double</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span>
397</pre>
398<p>
399                    </p>
400                  </td>
401<td>
402                    <p>
403                      <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>
404                    </p>
405                  </td>
406</tr>
407<tr>
408<td>
409                    <p>
410</p>
411<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special">&lt;</span>
412    <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span>
413<span class="special">&gt;()</span>
414<span class="identifier">real_parser</span><span class="special">&lt;</span>
415    <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span>
416<span class="special">&gt;()(</span><span class="identifier">num</span><span class="special">)</span>
417</pre>
418<p>
419                    </p>
420                  </td>
421<td>
422                    <p>
423                      <code class="computeroutput"><span class="identifier">T</span></code>
424                    </p>
425                  </td>
426</tr>
427</tbody>
428</table></div>
429<h6>
430<a name="spirit.qi.reference.numeric.real.h8"></a>
431            <span class="phrase"><a name="spirit.qi.reference.numeric.real.complexity"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.complexity">Complexity</a>
432          </h6>
433<div class="blockquote"><blockquote class="blockquote"><p>
434              O(N), where N is the number of characters (including the digits, exponent,
435              sign, etc.) being parsed.
436            </p></blockquote></div>
437<h6>
438<a name="spirit.qi.reference.numeric.real.h9"></a>
439            <span class="phrase"><a name="spirit.qi.reference.numeric.real.minimum_expression_requirements_for__code__phrase_role__identifier__t__phrase___code_"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.minimum_expression_requirements_for__code__phrase_role__identifier__t__phrase___code_">Minimum
440            Expression Requirements for <code class="computeroutput"><span class="identifier">T</span></code></a>
441          </h6>
442<p>
443            The numeric base type, <code class="computeroutput"><span class="identifier">T</span></code>,
444            the minimum expression requirements listed below must be valid. Take
445            note that additional requirements may be imposed by custom policies.
446          </p>
447<div class="informaltable"><table class="table">
448<colgroup>
449<col>
450<col>
451</colgroup>
452<thead><tr>
453<th>
454                    <p>
455                      Expression
456                    </p>
457                  </th>
458<th>
459                    <p>
460                      Semantics
461                    </p>
462                  </th>
463</tr></thead>
464<tbody>
465<tr>
466<td>
467                    <p>
468                      <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code>
469                    </p>
470                  </td>
471<td>
472                    <p>
473                      Default construct.
474                    </p>
475                  </td>
476</tr>
477<tr>
478<td>
479                    <p>
480                      <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="number">0</span><span class="special">)</span></code>
481                    </p>
482                  </td>
483<td>
484                    <p>
485                      Construct from an <code class="computeroutput"><span class="keyword">int</span></code>.
486                    </p>
487                  </td>
488</tr>
489<tr>
490<td>
491                    <p>
492                      <code class="computeroutput"><span class="identifier">n</span> <span class="special">+</span>
493                      <span class="identifier">n</span></code>
494                    </p>
495                  </td>
496<td>
497                    <p>
498                      Addition.
499                    </p>
500                  </td>
501</tr>
502<tr>
503<td>
504                    <p>
505                      <code class="computeroutput"><span class="identifier">n</span> <span class="special">-</span>
506                      <span class="identifier">n</span></code>
507                    </p>
508                  </td>
509<td>
510                    <p>
511                      Subtraction.
512                    </p>
513                  </td>
514</tr>
515<tr>
516<td>
517                    <p>
518                      <code class="computeroutput"><span class="identifier">n</span> <span class="special">*</span>
519                      <span class="identifier">n</span></code>
520                    </p>
521                  </td>
522<td>
523                    <p>
524                      Multiplication.
525                    </p>
526                  </td>
527</tr>
528<tr>
529<td>
530                    <p>
531                      <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_bounded</span></code>
532                    </p>
533                  </td>
534<td>
535                    <p>
536                      <code class="computeroutput"><span class="keyword">true</span></code> or <code class="computeroutput"><span class="keyword">false</span></code> if <code class="computeroutput"><span class="identifier">T</span></code>
537                      bounded.
538                    </p>
539                  </td>
540</tr>
541<tr>
542<td>
543                    <p>
544                      <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits</span></code>
545                    </p>
546                  </td>
547<td>
548                    <p>
549                      Maximum Digits for <code class="computeroutput"><span class="identifier">T</span></code>,
550                      radix digits. Required only if <code class="computeroutput"><span class="identifier">T</span></code>
551                      is bounded.
552                    </p>
553                  </td>
554</tr>
555<tr>
556<td>
557                    <p>
558                      <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits10</span></code>
559                    </p>
560                  </td>
561<td>
562                    <p>
563                      Maximum Digits for <code class="computeroutput"><span class="identifier">T</span></code>,
564                      base 10. Required only if <code class="computeroutput"><span class="identifier">T</span></code>
565                      is bounded.
566                    </p>
567                  </td>
568</tr>
569<tr>
570<td>
571                    <p>
572                      <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</span></code>
573                    </p>
574                  </td>
575<td>
576                    <p>
577                      Maximum value for <code class="computeroutput"><span class="identifier">T</span></code>.
578                      Required only if <code class="computeroutput"><span class="identifier">T</span></code>
579                      is bounded.
580                    </p>
581                  </td>
582</tr>
583<tr>
584<td>
585                    <p>
586                      <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">min</span><span class="special">()</span></code>
587                    </p>
588                  </td>
589<td>
590                    <p>
591                      Minimum value for <code class="computeroutput"><span class="identifier">T</span></code>.
592                      Required only if <code class="computeroutput"><span class="identifier">T</span></code>
593                      is bounded.
594                    </p>
595                  </td>
596</tr>
597<tr>
598<td>
599                    <p>
600                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">traits</span><span class="special">::</span><span class="identifier">scale</span><span class="special">(</span><span class="identifier">exp</span><span class="special">,</span>
601                      <span class="identifier">n</span><span class="special">)</span></code>
602                    </p>
603                  </td>
604<td>
605                    <p>
606                      Multiply <code class="computeroutput"><span class="identifier">n</span></code>
607                      by <code class="computeroutput"><span class="number">10</span><span class="special">^</span><span class="identifier">exp</span></code>. Default implementation
608                      is provided for <code class="computeroutput"><span class="keyword">float</span></code>,
609                      <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>.
610                    </p>
611                  </td>
612</tr>
613<tr>
614<td>
615                    <p>
616                      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">traits</span><span class="special">::</span><span class="identifier">negate</span><span class="special">(</span><span class="identifier">b</span><span class="special">,</span>
617                      <span class="identifier">n</span><span class="special">)</span></code>
618                    </p>
619                  </td>
620<td>
621                    <p>
622                      Negate <code class="computeroutput"><span class="identifier">n</span></code> if
623                      <code class="computeroutput"><span class="identifier">b</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>. Default implementation
624                      is provided for <code class="computeroutput"><span class="keyword">float</span></code>,
625                      <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>.
626                    </p>
627                  </td>
628</tr>
629</tbody>
630</table></div>
631<div class="note"><table border="0" summary="Note">
632<tr>
633<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
634<th align="left">Note</th>
635</tr>
636<tr><td align="left" valign="top"><p>
637              The additional spirit real number traits above are provided to allow
638              custom implementations to implement efficient real number parsers.
639              For example, for certain custom real numbers, scaling to a base 10
640              exponent is a very cheap operation.
641            </p></td></tr>
642</table></div>
643<h6>
644<a name="spirit.qi.reference.numeric.real.h10"></a>
645            <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code_"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code_"><code class="computeroutput"><span class="identifier">RealPolicies</span></code></a>
646          </h6>
647<p>
648            The <code class="computeroutput"><span class="identifier">RealPolicies</span></code> template
649            parameter is a class that groups all the policies that control the parser's
650            behavior. Policies control the real number parsers' behavior.
651          </p>
652<p>
653            The default is <code class="computeroutput"><span class="identifier">real_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>. The default is provided to take
654            care of the most common case (there are many ways to represent, and hence
655            parse, real numbers). In most cases, the default policies are sufficient
656            and can be used straight out of the box. They are designed to parse C/C++
657            style floating point numbers of the form <code class="computeroutput"><span class="identifier">nnn</span><span class="special">.</span><span class="identifier">fff</span><span class="special">.</span><span class="identifier">Eeee</span></code>
658            where <code class="computeroutput"><span class="identifier">nnn</span></code> is the whole
659            number part, <code class="computeroutput"><span class="identifier">fff</span></code> is the
660            fractional part, <code class="computeroutput"><span class="identifier">E</span></code> is
661            <code class="computeroutput"><span class="char">'e'</span></code> or <code class="computeroutput"><span class="char">'E'</span></code>
662            and <code class="computeroutput"><span class="identifier">eee</span></code> is the exponent
663            optionally preceded by <code class="computeroutput"><span class="char">'-'</span></code>
664            or <code class="computeroutput"><span class="char">'+'</span></code> with the additional
665            detection of NaN and Inf as mandated by the C99 Standard and proposed
666            for inclusion into the C++0x Standard: nan, nan(...), inf and infinity
667            (the matching is case-insensitive). This corresponds to the following
668            grammar:
669          </p>
670<pre class="programlisting"><span class="identifier">sign</span>
671    <span class="special">=</span>   <span class="identifier">lit</span><span class="special">(</span><span class="char">'+'</span><span class="special">)</span> <span class="special">|</span> <span class="char">'-'</span>
672    <span class="special">;</span>
673
674<span class="identifier">nan</span>
675    <span class="special">=</span>   <span class="identifier">no_case</span><span class="special">[</span><span class="string">"nan"</span><span class="special">]</span>
676        <span class="special">&gt;&gt;</span> <span class="special">-(</span><span class="char">'('</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="char">')'</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">)</span>
677    <span class="special">;</span>
678
679<span class="identifier">inf</span>
680    <span class="special">=</span>   <span class="identifier">no_case</span><span class="special">[</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"inf"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"inity"</span><span class="special">)]</span>
681    <span class="special">;</span>
682
683<span class="identifier">floating_literal</span>
684    <span class="special">=</span>   <span class="special">-</span><span class="identifier">sign</span> <span class="special">&gt;&gt;</span>
685        <span class="special">(</span>       <span class="identifier">nan</span>
686            <span class="special">|</span>   <span class="identifier">inf</span>
687            <span class="special">|</span>   <span class="identifier">fractional_constant</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">exponent_part</span>
688            <span class="special">|</span>  <span class="special">+</span><span class="identifier">digit</span> <span class="special">&gt;&gt;</span> <span class="identifier">exponent_part</span>
689        <span class="special">)</span>
690    <span class="special">;</span>
691
692<span class="identifier">fractional_constant</span>
693    <span class="special">=</span>  <span class="special">*</span><span class="identifier">digit</span> <span class="special">&gt;&gt;</span> <span class="char">'.'</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">digit</span>
694    <span class="special">|</span>  <span class="special">+</span><span class="identifier">digit</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="char">'.'</span><span class="special">)</span>
695    <span class="special">;</span>
696
697<span class="identifier">exponent_part</span>
698    <span class="special">=</span>   <span class="special">(</span><span class="identifier">lit</span><span class="special">(</span><span class="char">'e'</span><span class="special">)</span> <span class="special">|</span> <span class="char">'E'</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">sign</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">digit</span>
699    <span class="special">;</span>
700</pre>
701<p>
702            There are four <code class="computeroutput"><span class="identifier">RealPolicies</span></code>
703            predefined for immediate use:
704          </p>
705<div class="table">
706<a name="spirit.qi.reference.numeric.real.predefined_policies"></a><p class="title"><b>Table 4. Predefined Policies</b></p>
707<div class="table-contents"><table class="table" summary="Predefined Policies">
708<colgroup>
709<col>
710<col>
711</colgroup>
712<thead><tr>
713<th>
714                    <p>
715                      Policies
716                    </p>
717                  </th>
718<th>
719                    <p>
720                      Description
721                    </p>
722                  </th>
723</tr></thead>
724<tbody>
725<tr>
726<td>
727                    <p>
728                      <code class="computeroutput"><span class="identifier">ureal_policies</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code>
729                    </p>
730                  </td>
731<td>
732                    <p>
733                      Without sign.
734                    </p>
735                  </td>
736</tr>
737<tr>
738<td>
739                    <p>
740                      <code class="computeroutput"><span class="identifier">real_policies</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code>
741                    </p>
742                  </td>
743<td>
744                    <p>
745                      With sign.
746                    </p>
747                  </td>
748</tr>
749<tr>
750<td>
751                    <p>
752                      <code class="computeroutput"><span class="identifier">strict_ureal_policies</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code>
753                    </p>
754                  </td>
755<td>
756                    <p>
757                      Without sign, dot required.
758                    </p>
759                  </td>
760</tr>
761<tr>
762<td>
763                    <p>
764                      <code class="computeroutput"><span class="identifier">strict_real_policies</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code>
765                    </p>
766                  </td>
767<td>
768                    <p>
769                      With sign, dot required.
770                    </p>
771                  </td>
772</tr>
773</tbody>
774</table></div>
775</div>
776<br class="table-break"><div class="note"><table border="0" summary="Note">
777<tr>
778<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
779<th align="left">Note</th>
780</tr>
781<tr><td align="left" valign="top"><p>
782              Integers are considered a subset of real numbers, so for instance,
783              <code class="computeroutput"><span class="identifier">double_</span></code> recognizes
784              integer numbers (without a dot) just as well. To avoid this ambiguity,
785              <code class="computeroutput"><span class="identifier">strict_ureal_policies</span></code>
786              and <code class="computeroutput"><span class="identifier">strict_real_policies</span></code>
787              require a dot to be present for a number to be considered a successful
788              match.
789            </p></td></tr>
790</table></div>
791<h6>
792<a name="spirit.qi.reference.numeric.real.h11"></a>
793            <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__expression_requirements"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__expression_requirements"><code class="computeroutput"><span class="identifier">RealPolicies</span></code> Expression Requirements</a>
794          </h6>
795<p>
796            For models of <code class="computeroutput"><span class="identifier">RealPolicies</span></code>
797            the following expressions must be valid:
798          </p>
799<div class="informaltable"><table class="table">
800<colgroup>
801<col>
802<col>
803</colgroup>
804<thead><tr>
805<th>
806                    <p>
807                      Expression
808                    </p>
809                  </th>
810<th>
811                    <p>
812                      Semantics
813                    </p>
814                  </th>
815</tr></thead>
816<tbody>
817<tr>
818<td>
819                    <p>
820                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">allow_leading_dot</span></code>
821                    </p>
822                  </td>
823<td>
824                    <p>
825                      Allow leading dot.
826                    </p>
827                  </td>
828</tr>
829<tr>
830<td>
831                    <p>
832                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">allow_trailing_dot</span></code>
833                    </p>
834                  </td>
835<td>
836                    <p>
837                      Allow trailing dot.
838                    </p>
839                  </td>
840</tr>
841<tr>
842<td>
843                    <p>
844                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">expect_dot</span></code>
845                    </p>
846                  </td>
847<td>
848                    <p>
849                      Require a dot.
850                    </p>
851                  </td>
852</tr>
853<tr>
854<td>
855                    <p>
856                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_sign</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
857                      <span class="identifier">l</span><span class="special">)</span></code>
858                    </p>
859                  </td>
860<td>
861                    <p>
862                      Parse the prefix sign (e.g. '-'). Return <code class="computeroutput"><span class="keyword">true</span></code>
863                      if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
864                    </p>
865                  </td>
866</tr>
867<tr>
868<td>
869                    <p>
870                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
871                      <span class="identifier">l</span><span class="special">,</span>
872                      <span class="identifier">n</span><span class="special">)</span></code>
873                    </p>
874                  </td>
875<td>
876                    <p>
877                      Parse the integer at the left of the decimal point. Return
878                      <code class="computeroutput"><span class="keyword">true</span></code> if successful,
879                      otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
880                      If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>.
881                    </p>
882                  </td>
883</tr>
884<tr>
885<td>
886                    <p>
887                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_dot</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
888                      <span class="identifier">l</span><span class="special">)</span></code>
889                    </p>
890                  </td>
891<td>
892                    <p>
893                      Parse the decimal point. Return <code class="computeroutput"><span class="keyword">true</span></code>
894                      if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
895                    </p>
896                  </td>
897</tr>
898<tr>
899<td>
900                    <p>
901                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_frac_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
902                      <span class="identifier">l</span><span class="special">,</span>
903                      <span class="identifier">n</span><span class="special">,</span>
904                      <span class="identifier">d</span><span class="special">)</span></code>
905                    </p>
906                  </td>
907<td>
908                    <p>
909                      Parse the fraction after the decimal point. Return <code class="computeroutput"><span class="keyword">true</span></code> if successful, otherwise
910                      <code class="computeroutput"><span class="keyword">false</span></code>. If successful,
911                      place the result into <code class="computeroutput"><span class="identifier">n</span></code>
912                      and the number of digits into <code class="computeroutput"><span class="identifier">d</span></code>
913                    </p>
914                  </td>
915</tr>
916<tr>
917<td>
918                    <p>
919                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_exp</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
920                      <span class="identifier">l</span><span class="special">)</span></code>
921                    </p>
922                  </td>
923<td>
924                    <p>
925                      Parse the exponent prefix (e.g. 'e'). Return <code class="computeroutput"><span class="keyword">true</span></code> if successful, otherwise
926                      <code class="computeroutput"><span class="keyword">false</span></code>.
927                    </p>
928                  </td>
929</tr>
930<tr>
931<td>
932                    <p>
933                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_exp_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
934                      <span class="identifier">l</span><span class="special">,</span>
935                      <span class="identifier">n</span><span class="special">)</span></code>
936                    </p>
937                  </td>
938<td>
939                    <p>
940                      Parse the actual exponent. Return <code class="computeroutput"><span class="keyword">true</span></code>
941                      if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
942                      If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>.
943                    </p>
944                  </td>
945</tr>
946<tr>
947<td>
948                    <p>
949                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_nan</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
950                      <span class="identifier">l</span><span class="special">,</span>
951                      <span class="identifier">n</span><span class="special">)</span></code>
952                    </p>
953                  </td>
954<td>
955                    <p>
956                      Parse a NaN. Return <code class="computeroutput"><span class="keyword">true</span></code>
957                      if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
958                      If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>.
959                    </p>
960                  </td>
961</tr>
962<tr>
963<td>
964                    <p>
965                      <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_inf</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
966                      <span class="identifier">l</span><span class="special">,</span>
967                      <span class="identifier">n</span><span class="special">)</span></code>
968                    </p>
969                  </td>
970<td>
971                    <p>
972                      Parse an Inf. Return <code class="computeroutput"><span class="keyword">true</span></code>
973                      if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
974                      If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>.
975                    </p>
976                  </td>
977</tr>
978</tbody>
979</table></div>
980<p>
981            The <code class="computeroutput"><span class="identifier">parse_nan</span></code> and <code class="computeroutput"><span class="identifier">parse_inf</span></code> functions get called whenever
982            a number to parse does not start with a digit (after having successfully
983            parsed an optional sign).
984          </p>
985<p>
986            The functions should return true if a Nan or Inf has been found. In this
987            case the attribute <code class="computeroutput"><span class="identifier">n</span></code>
988            should be set to the matched value (NaN or Inf). The optional sign will
989            be automatically applied afterwards.
990          </p>
991<h6>
992<a name="spirit.qi.reference.numeric.real.h12"></a>
993            <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__specializations"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__specializations"><code class="computeroutput"><span class="identifier">RealPolicies</span></code> Specializations</a>
994          </h6>
995<p>
996            The easiest way to implement a proper real parsing policy is to derive
997            a new type from the type <code class="computeroutput"><span class="identifier">real_policies</span></code>
998            while overriding the aspects of the parsing which need to be changed.
999            For example, here's the implementation of the predefined <code class="computeroutput"><span class="identifier">strict_real_policies</span></code>:
1000          </p>
1001<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
1002<span class="keyword">struct</span> <span class="identifier">strict_real_policies</span> <span class="special">:</span> <span class="identifier">real_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span>
1003<span class="special">{</span>
1004    <span class="keyword">static</span> <span class="keyword">bool</span> <span class="keyword">const</span> <span class="identifier">expect_dot</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
1005<span class="special">};</span>
1006</pre>
1007<h6>
1008<a name="spirit.qi.reference.numeric.real.h13"></a>
1009            <span class="phrase"><a name="spirit.qi.reference.numeric.real.example"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.example">Example</a>
1010          </h6>
1011<div class="note"><table border="0" summary="Note">
1012<tr>
1013<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
1014<th align="left">Note</th>
1015</tr>
1016<tr><td align="left" valign="top"><p>
1017              The test harness for the example(s) below is presented in the <a class="link" href="../basics.html#spirit.qi.reference.basics.examples">Basics Examples</a>
1018              section.
1019            </p></td></tr>
1020</table></div>
1021<p>
1022            Some using declarations:
1023          </p>
1024<p>
1025</p>
1026<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">val</span><span class="special">;</span>
1027<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">double_</span><span class="special">;</span>
1028<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">real_parser</span><span class="special">;</span>
1029<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">lit</span><span class="special">;</span>
1030</pre>
1031<p>
1032          </p>
1033<p>
1034            Basic real number parsing:
1035          </p>
1036<p>
1037</p>
1038<pre class="programlisting"><span class="comment">// double</span>
1039<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">);</span>
1040<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">);</span>
1041<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="number">12345e6</span><span class="special">));</span>
1042<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">));</span>
1043<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">12345e6</span><span class="special">)));</span>
1044<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="identifier">val</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">)));</span>
1045
1046<span class="comment">// literals</span>
1047<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="number">12345e6</span><span class="special">));</span>
1048<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">));</span>
1049<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">12345e6</span><span class="special">)));</span>
1050<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">val</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">)));</span>
1051</pre>
1052<p>
1053          </p>
1054<p>
1055            A custom real number policy:
1056          </p>
1057<p>
1058</p>
1059<pre class="programlisting"><span class="comment">///////////////////////////////////////////////////////////////////////////////</span>
1060<span class="comment">//  These policies can be used to parse thousand separated</span>
1061<span class="comment">//  numbers with at most 2 decimal digits after the decimal</span>
1062<span class="comment">//  point. e.g. 123,456,789.01</span>
1063<span class="comment">///////////////////////////////////////////////////////////////////////////////</span>
1064<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
1065<span class="keyword">struct</span> <span class="identifier">ts_real_policies</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">ureal_policies</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span>
1066<span class="special">{</span>
1067    <span class="comment">//  2 decimal places Max</span>
1068    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attribute</span><span class="special">&gt;</span>
1069    <span class="keyword">static</span> <span class="keyword">bool</span>
1070    <span class="identifier">parse_frac_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Attribute</span><span class="special">&amp;</span> <span class="identifier">attr</span><span class="special">,</span>
1071                 <span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">frac_digits</span><span class="special">)</span>
1072    <span class="special">{</span>
1073        <span class="identifier">Iterator</span> <span class="identifier">savef</span> <span class="special">=</span> <span class="identifier">first</span><span class="special">;</span>
1074        <span class="keyword">bool</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span>
1075            <span class="identifier">extract_uint</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="keyword">true</span><span class="special">&gt;::</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">attr</span><span class="special">);</span>
1076        <span class="keyword">if</span> <span class="special">(</span><span class="identifier">r</span><span class="special">)</span> <span class="special">{</span>
1077            <span class="comment">// Optimization note: don't compute frac_digits if T is</span>
1078            <span class="comment">// an unused_type. This should be optimized away by the compiler.</span>
1079            <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">unused_type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span>
1080                <span class="identifier">frac_digits</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">savef</span><span class="special">,</span> <span class="identifier">first</span><span class="special">));</span>
1081        <span class="special">}</span>
1082        <span class="keyword">return</span> <span class="identifier">r</span><span class="special">;</span>
1083    <span class="special">}</span>
1084
1085    <span class="comment">//  No exponent</span>
1086    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
1087    <span class="keyword">static</span> <span class="keyword">bool</span>
1088    <span class="identifier">parse_exp</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&amp;,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;)</span>
1089    <span class="special">{</span>
1090        <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
1091    <span class="special">}</span>
1092
1093    <span class="comment">//  No exponent</span>
1094    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attribute</span><span class="special">&gt;</span>
1095    <span class="keyword">static</span> <span class="keyword">bool</span>
1096    <span class="identifier">parse_exp_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&amp;,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;,</span> <span class="identifier">Attribute</span><span class="special">&amp;)</span>
1097    <span class="special">{</span>
1098        <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
1099    <span class="special">}</span>
1100
1101    <span class="comment">//  Thousands separated numbers</span>
1102    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Accumulator</span><span class="special">&gt;</span>
1103    <span class="keyword">static</span> <span class="keyword">bool</span>
1104    <span class="identifier">parse_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Accumulator</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span>
1105    <span class="special">{</span>
1106        <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">uint_parser</span><span class="special">;</span>
1107        <span class="keyword">namespace</span> <span class="identifier">qi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">;</span>
1108
1109        <span class="identifier">uint_parser</span><span class="special">&lt;</span><span class="keyword">unsigned</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;</span> <span class="identifier">uint3</span><span class="special">;</span>
1110        <span class="identifier">uint_parser</span><span class="special">&lt;</span><span class="keyword">unsigned</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;</span> <span class="identifier">uint3_3</span><span class="special">;</span>
1111
1112        <span class="keyword">if</span> <span class="special">(</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">uint3</span><span class="special">,</span> <span class="identifier">result</span><span class="special">))</span>
1113        <span class="special">{</span>
1114            <span class="identifier">Accumulator</span> <span class="identifier">n</span><span class="special">;</span>
1115            <span class="identifier">Iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">first</span><span class="special">;</span>
1116
1117            <span class="keyword">while</span> <span class="special">(</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="char">','</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">uint3_3</span><span class="special">,</span> <span class="identifier">n</span><span class="special">))</span>
1118            <span class="special">{</span>
1119                <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">result</span> <span class="special">*</span> <span class="number">1000</span> <span class="special">+</span> <span class="identifier">n</span><span class="special">;</span>
1120                <span class="identifier">first</span> <span class="special">=</span> <span class="identifier">iter</span><span class="special">;</span>
1121            <span class="special">}</span>
1122
1123            <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
1124        <span class="special">}</span>
1125        <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
1126    <span class="special">}</span>
1127<span class="special">};</span>
1128</pre>
1129<p>
1130          </p>
1131<p>
1132            And its use:
1133          </p>
1134<p>
1135</p>
1136<pre class="programlisting"><span class="identifier">real_parser</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">ts_real_policies</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">ts_real</span><span class="special">;</span>
1137<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"123,456,789.01"</span><span class="special">,</span> <span class="identifier">ts_real</span><span class="special">);</span>
1138<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"123,456,789.01"</span><span class="special">,</span> <span class="identifier">ts_real</span><span class="special">(</span><span class="number">123456789.01</span><span class="special">));</span>
1139</pre>
1140<p>
1141          </p>
1142</div>
1143<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1144<td align="left"></td>
1145<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
1146        Distributed under the Boost Software License, Version 1.0. (See accompanying
1147        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>)
1148      </p>
1149</div></td>
1150</tr></table>
1151<hr>
1152<div class="spirit-nav">
1153<a accesskey="p" href="int.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric.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="boolean.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
1154</div>
1155</body>
1156</html>
1157