• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Use in template code</title>
5<link rel="stylesheet" href="../../math.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../index.html" title="Math Toolkit 2.12.0">
8<link rel="up" href="../tutorial.html" title="Tutorial">
9<link rel="prev" href="non_templ.html" title="Use in non-template code">
10<link rel="next" href="user_def.html" title="Use With User-Defined Types">
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="non_templ.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.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="user_def.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="math_toolkit.tutorial.templ"></a><a class="link" href="templ.html" title="Use in template code">Use in template code</a>
28</h3></div></div></div>
29<p>
30        When using the constants inside a function template, we need to ensure that
31        we use a constant of the correct precision for our template parameters. We
32        can do this by calling the function-template versions, <code class="computeroutput"><span class="identifier">pi</span><span class="special">&lt;</span><span class="identifier">FPType</span><span class="special">&gt;()</span></code>, of the constants like this:
33      </p>
34<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">constants</span><span class="special">/</span><span class="identifier">constants</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
35
36<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">&gt;</span>
37<span class="identifier">Real</span> <span class="identifier">area</span><span class="special">(</span><span class="identifier">Real</span> <span class="identifier">r</span><span class="special">)</span>
38<span class="special">{</span>
39   <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">;</span>
40   <span class="keyword">return</span> <span class="identifier">pi</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;()</span> <span class="special">*</span> <span class="identifier">r</span> <span class="special">*</span> <span class="identifier">r</span><span class="special">;</span>
41<span class="special">}</span>
42</pre>
43<p>
44        Although this syntax is a little less "cute" than the non-template
45        version, the code is no less efficient (at least for the built-in types
46        <code class="computeroutput"><span class="keyword">float</span></code>, <code class="computeroutput"><span class="keyword">double</span></code>
47        and <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>)
48        : the function template versions of the constants are simple inline functions
49        that return a constant of the correct precision for the type used. In addition,
50        these functions are declared <code class="computeroutput"><span class="identifier">constexp</span></code>
51        for those compilers that support this, allowing the result to be used in
52        constant-expressions provided the template argument is a literal type.
53      </p>
54<div class="tip"><table border="0" summary="Tip">
55<tr>
56<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
57<th align="left">Tip</th>
58</tr>
59<tr><td align="left" valign="top"><p>
60          Keep in mind the difference between the variable version, just <code class="computeroutput"><span class="identifier">pi</span></code>, and the template-function version:
61          the template-function requires both a &lt;<em class="replaceable"><code>floating-point-type</code></em>&gt;
62          and function call <code class="computeroutput"><span class="special">()</span></code> brackets,
63          for example: <code class="computeroutput"><span class="identifier">pi</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;()</span></code>.
64          You cannot write <code class="computeroutput"><span class="keyword">double</span> <span class="identifier">p</span>
65          <span class="special">=</span> <span class="identifier">pi</span><span class="special">&lt;&gt;()</span></code>, nor <code class="computeroutput"><span class="keyword">double</span>
66          <span class="identifier">p</span> <span class="special">=</span>
67          <span class="identifier">pi</span><span class="special">()</span></code>.
68        </p></td></tr>
69</table></div>
70<div class="note"><table border="0" summary="Note">
71<tr>
72<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
73<th align="left">Note</th>
74</tr>
75<tr><td align="left" valign="top">
76<p>
77          You can always use <span class="bold"><strong>both</strong></span> variable and template-function
78          versions <span class="bold"><strong>provided calls are fully qualified</strong></span>,
79          for example:
80        </p>
81<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">my_pi1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;();</span>
82<span class="keyword">double</span> <span class="identifier">my_pi2</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special">;</span>
83</pre>
84</td></tr>
85</table></div>
86<div class="warning"><table border="0" summary="Warning">
87<tr>
88<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../doc/src/images/warning.png"></td>
89<th align="left">Warning</th>
90</tr>
91<tr><td align="left" valign="top">
92<p>
93          It may be tempting to simply define
94        </p>
95<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_constants</span><span class="special">;</span>
96<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">;</span>
97</pre>
98<p>
99          but if you do define two namespaces, this will, of course, create ambiguity!
100        </p>
101<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">my_pi</span> <span class="special">=</span> <span class="identifier">pi</span><span class="special">();</span> <span class="comment">// error C2872: 'pi' : ambiguous symbol</span>
102<span class="keyword">double</span> <span class="identifier">my_pi2</span> <span class="special">=</span> <span class="identifier">pi</span><span class="special">;</span> <span class="comment">// Context does not allow for disambiguation of overloaded function</span>
103</pre>
104<p>
105          Although the mistake above is fairly obvious, it is also not too difficult
106          to do this accidentally, or worse, create it in someone elses code.
107        </p>
108<p>
109          Therefore is it prudent to avoid this risk by <span class="bold"><strong>localising
110          the scope of such definitions</strong></span>, as shown above.
111        </p>
112</td></tr>
113</table></div>
114<div class="tip"><table border="0" summary="Tip">
115<tr>
116<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
117<th align="left">Tip</th>
118</tr>
119<tr><td align="left" valign="top">
120<p>
121          Be very careful with the type provided as parameter. For example, providing
122          an <span class="bold"><strong>integer</strong></span> instead of a floating-point
123          type can be disastrous (a C++ feature).
124        </p>
125<pre class="programlisting"><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Area = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">area</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Area = 12!!!</span></pre>
126<p>
127          You should get a compiler warning
128        </p>
129<pre class="programlisting">warning : 'return' : conversion from 'double' to 'int', possible loss of data
130</pre>
131<p>
132          Failure to heed this warning can lead to very wrong answers!
133        </p>
134<p>
135          You can also avoid this by being explicit about the type of <code class="computeroutput"><span class="identifier">Area</span></code>.
136        </p>
137<pre class="programlisting"><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Area = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">area</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;(</span><span class="number">2</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Area = 12.566371</span></pre>
138</td></tr>
139</table></div>
140</div>
141<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
142<td align="left"></td>
143<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
144      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
145      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
146      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
147      Daryle Walker and Xiaogang Zhang<p>
148        Distributed under the Boost Software License, Version 1.0. (See accompanying
149        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>)
150      </p>
151</div></td>
152</tr></table>
153<hr>
154<div class="spirit-nav">
155<a accesskey="p" href="non_templ.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.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="user_def.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
156</div>
157</body>
158</html>
159