1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
5 <title>Examples</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="../boost_units.html" title="Chapter 43. Boost.Units 1.1.0">
10 <link rel="prev" href="Quantities.html" title="Quantities">
11 <link rel="next" href="Utilities.html" title="Utilities">
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>
23 <div class="spirit-nav">
24 <a accesskey="p" href="Quantities.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_units.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="Utilities.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
27 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
28 <a name="boost_units.Examples"></a><a class="link" href="Examples.html" title="Examples">Examples</a>
29 </h2></div></div></div>
30 <div class="toc"><dl class="toc">
31 <dt><span class="section"><a href="Examples.html#boost_units.Examples.DimensionExample">Dimension Example</a></span></dt>
32 <dt><span class="section"><a href="Examples.html#boost_units.Examples.UnitExample">Unit Example</a></span></dt>
33 <dt><span class="section"><a href="Examples.html#boost_units.Examples.QuantityExample">Quantity Example</a></span></dt>
34 <dt><span class="section"><a href="Examples.html#boost_units.Examples.KitchenSinkExample">Kitchen Sink
35 Example using SI units</a></span></dt>
36 <dt><span class="section"><a href="Examples.html#boost_units.Examples.ConversionExample">Conversion Example</a></span></dt>
37 <dt><span class="section"><a href="Examples.html#boost_units.Examples.UDTExample">User Defined Types</a></span></dt>
38 <dt><span class="section"><a href="Examples.html#boost_units.Examples.ComplexExample">Complex Example</a></span></dt>
39 <dt><span class="section"><a href="Examples.html#boost_units.Examples.PerformanceExample">Performance
40 Example</a></span></dt>
41 <dt><span class="section"><a href="Examples.html#boost_units.Examples.RadarBeamHeightExample">Radar Beam
42 Height</a></span></dt>
43 <dt><span class="section"><a href="Examples.html#boost_units.Examples.HeterogeneousUnitExample">Heterogeneous
44 Unit Example</a></span></dt>
45 <dt><span class="section"><a href="Examples.html#boost_units.Examples.AbsoluteRelativeTemperatureExample">Absolute
46 and Relative Temperature Example</a></span></dt>
47 <dt><span class="section"><a href="Examples.html#boost_units.Examples.RuntimeConversionFactorExample">Runtime
48 Conversion Factor Example</a></span></dt>
49 <dt><span class="section"><a href="Examples.html#boost_units.Examples.UnitsWithNonbaseDimensions">Units
50 with Non-base Dimensions</a></span></dt>
51 <dt><span class="section"><a href="Examples.html#boost_units.Examples.OutputForCompositeUnits">Output
52 for Composite Units</a></span></dt>
53 <dt><span class="section"><a href="Examples.html#boost_units.Examples.autoscale">Automatically Scaled
55 <dt><span class="section"><a href="Examples.html#boost_units.Examples.ConversionFactor">Conversion Factor</a></span></dt>
56 <dt><span class="section"><a href="Examples.html#boost_units.Examples.RuntimeUnits">Runtime Units</a></span></dt>
57 <dt><span class="section"><a href="Examples.html#boost_units.Examples.lambda">Interoperability with Boost.Lambda</a></span></dt>
60 <div class="titlepage"><div><div><h3 class="title">
61 <a name="boost_units.Examples.DimensionExample"></a><a class="link" href="Examples.html#boost_units.Examples.DimensionExample" title="Dimension Example">Dimension Example</a>
62 </h3></div></div></div>
64 (<a href="../../../libs/units/example/dimension.cpp" target="_top">dimension.cpp</a>)
67 By using MPL metafunctions and the template specializations for operations
68 on composite dimensions (defined in <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.dimension_hpp" title="Header <boost/units/dimension.hpp>">boost/units/dimension.hpp</a></code>)
69 it is possible to perform compile time arithmetic according to the dimensional
70 analysis rules described <a class="link" href="Dimensional_Analysis.html" title="Dimensional Analysis">above</a>
71 to produce new composite dimensions :
75 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">mass_dimension</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">LM_type</span><span class="special">;</span>
76 <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">time_dimension</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">L_T_type</span><span class="special">;</span>
77 <span class="keyword">typedef</span> <span class="identifier">static_root</span><span class="special"><</span>
78 <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special"><</span><span class="identifier">energy_dimension</span><span class="special">,</span><span class="identifier">mass_dimension</span><span class="special">>::</span><span class="identifier">type</span><span class="special">,</span>
79 <span class="identifier">static_rational</span><span class="special"><</span><span class="number">2</span><span class="special">></span>
80 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">V_type</span><span class="special">;</span>
85 outputting (with symbol demangling, implemented in <a href="../../../boost/units/detail/utility.hpp" target="_top">utility.hpp</a>)
89 <pre class="programlisting"><span class="identifier">length_dimension</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">length_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span>
90 <span class="identifier">mass_dimension</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">mass_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span>
91 <span class="identifier">time_dimension</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">time_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span>
92 <span class="identifier">energy_dimension</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">length_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">2l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">mass_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">time_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><-</span><span class="number">2l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span> <span class="special">></span> <span class="special">></span>
93 <span class="identifier">LM_type</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">length_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">mass_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span> <span class="special">></span>
94 <span class="identifier">L_T_type</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">length_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">time_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><-</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span> <span class="special">></span>
95 <span class="identifier">V_type</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">length_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">dim</span><span class="special"><</span><span class="identifier">time_base_dimension</span><span class="special">,</span> <span class="identifier">static_rational</span><span class="special"><-</span><span class="number">1l</span><span class="special">,</span> <span class="number">1l</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">dimensionless_type</span><span class="special">></span> <span class="special">></span>
100 <div class="section">
101 <div class="titlepage"><div><div><h3 class="title">
102 <a name="boost_units.Examples.UnitExample"></a><a class="link" href="Examples.html#boost_units.Examples.UnitExample" title="Unit Example">Unit Example</a>
103 </h3></div></div></div>
105 (<a href="../../../libs/units/example/unit.cpp" target="_top">unit.cpp</a>)
108 This example demonstrates the use of the simple but functional unit system
109 implemented in <a href="../../../libs/units/example/test_system.hpp" target="_top">test_system.hpp</a>
113 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">length</span> <span class="identifier">L</span><span class="special">;</span>
114 <span class="keyword">const</span> <span class="identifier">mass</span> <span class="identifier">M</span><span class="special">;</span>
115 <span class="comment">// needs to be namespace-qualified because of global time definition</span>
116 <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">test</span><span class="special">::</span><span class="identifier">time</span> <span class="identifier">T</span><span class="special">;</span>
117 <span class="keyword">const</span> <span class="identifier">energy</span> <span class="identifier">E</span><span class="special">;</span>
122 We can perform various algebraic operations on these units, resulting in
123 the following output:
127 <pre class="programlisting"><span class="identifier">L</span> <span class="special">=</span> <span class="identifier">m</span>
128 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="identifier">m</span>
129 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="identifier">m</span>
130 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="identifier">dimensionless</span>
131 <span class="identifier">meter</span><span class="special">*</span><span class="identifier">meter</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
132 <span class="identifier">M</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">T</span><span class="special">)*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">T</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
133 <span class="identifier">M</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">T</span><span class="special">)^</span><span class="number">2</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
134 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
135 <span class="identifier">L</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
136 <span class="number">2</span><span class="identifier">vM</span> <span class="special">=</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
137 <span class="special">(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span><span class="identifier">vM</span> <span class="special">=</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
142 <div class="section">
143 <div class="titlepage"><div><div><h3 class="title">
144 <a name="boost_units.Examples.QuantityExample"></a><a class="link" href="Examples.html#boost_units.Examples.QuantityExample" title="Quantity Example">Quantity Example</a>
145 </h3></div></div></div>
147 (<a href="../../../libs/units/example/quantity.cpp" target="_top">quantity.cpp</a>)
150 This example demonstrates how to use quantities of our toy unit system :
154 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">L</span> <span class="special">=</span> <span class="number">2.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">;</span> <span class="comment">// quantity of length</span>
155 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">E</span> <span class="special">=</span> <span class="identifier">kilograms</span><span class="special">*</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">);</span> <span class="comment">// quantity of energy</span>
160 giving us the basic quantity functionality :
164 <pre class="programlisting"><span class="identifier">L</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span>
165 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span>
166 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">0</span> <span class="identifier">m</span>
167 <span class="identifier">L</span><span class="special">*</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
168 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">dimensionless</span>
169 <span class="identifier">L</span><span class="special">*</span><span class="identifier">meter</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
170 <span class="identifier">kilograms</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
171 <span class="identifier">kilograms</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)^</span><span class="number">2</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
172 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="number">8</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
173 <span class="identifier">L</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">=</span> <span class="number">2.82843</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
174 <span class="number">2</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.41421</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
175 <span class="special">(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.5874</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
180 As a further demonstration of the flexibility of the system, we replace the
181 <code class="computeroutput"><span class="keyword">double</span></code> value type with a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> value type (ignoring the question of
182 the meaningfulness of complex lengths and energies) :
186 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">L</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">3.0</span><span class="special">,</span><span class="number">4.0</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">);</span>
187 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">energy</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">E</span><span class="special">(</span><span class="identifier">kilograms</span><span class="special">*</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">));</span>
192 and find that the code functions exactly as expected with no additional work,
193 delegating operations to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> and performing the appropriate dimensional
198 <pre class="programlisting"><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">3</span><span class="special">,</span><span class="number">4</span><span class="special">)</span> <span class="identifier">m</span>
199 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">6</span><span class="special">,</span><span class="number">8</span><span class="special">)</span> <span class="identifier">m</span>
200 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">m</span>
201 <span class="identifier">L</span><span class="special">*</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(-</span><span class="number">7</span><span class="special">,</span><span class="number">24</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
202 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">dimensionless</span>
203 <span class="identifier">L</span><span class="special">*</span><span class="identifier">meter</span> <span class="special">=</span> <span class="special">(</span><span class="number">3</span><span class="special">,</span><span class="number">4</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
204 <span class="identifier">kilograms</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)</span> <span class="special">=</span> <span class="special">(-</span><span class="number">7</span><span class="special">,</span><span class="number">24</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
205 <span class="identifier">kilograms</span><span class="special">*(</span><span class="identifier">L</span><span class="special">/</span><span class="identifier">seconds</span><span class="special">)^</span><span class="number">2</span> <span class="special">=</span> <span class="special">(-</span><span class="number">7</span><span class="special">,</span><span class="number">24</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
206 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="special">(-</span><span class="number">117</span><span class="special">,</span><span class="number">44</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
207 <span class="identifier">L</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">=</span> <span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="number">11</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
208 <span class="number">2</span><span class="identifier">vL</span> <span class="special">=</span> <span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="number">1</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
209 <span class="special">(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span><span class="identifier">vL</span> <span class="special">=</span> <span class="special">(</span><span class="number">2.38285</span><span class="special">,</span><span class="number">1.69466</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
214 <div class="section">
215 <div class="titlepage"><div><div><h3 class="title">
216 <a name="boost_units.Examples.KitchenSinkExample"></a><a class="link" href="Examples.html#boost_units.Examples.KitchenSinkExample" title="Kitchen Sink Example using SI units">Kitchen Sink
217 Example using SI units</a>
218 </h3></div></div></div>
219 <div class="toc"><dl class="toc"><dt><span class="section"><a href="Examples.html#boost_units.Examples.KitchenSinkExample.UDT_Quantities">User-defined
220 value types</a></span></dt></dl></div>
222 (<a href="../../../libs/units/example/kitchen_sink.cpp" target="_top">kitchen_sink.cpp</a>)
225 This example provides a fairly extensive set of tests covering most of the
226 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
227 functionality. It uses the SI unit system defined in <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.systems.si_hpp" title="Header <boost/units/systems/si.hpp>">boost/units/systems/si.hpp</a></code>.
230 If we define a few units and associated quantities,
234 <pre class="programlisting"><span class="comment">/// scalar</span>
235 <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">s1</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
237 <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">x1</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
238 <span class="keyword">const</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="number">4</span><span class="special">,</span><span class="number">3</span><span class="special">></span> <span class="identifier">x2</span><span class="special">;</span>
240 <span class="comment">/// define some units</span>
241 <span class="identifier">force</span> <span class="identifier">u1</span> <span class="special">=</span> <span class="identifier">newton</span><span class="special">;</span>
242 <span class="identifier">energy</span> <span class="identifier">u2</span> <span class="special">=</span> <span class="identifier">joule</span><span class="special">;</span>
244 <span class="comment">/// define some quantities</span>
245 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">force</span><span class="special">></span> <span class="identifier">q1</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">u1</span><span class="special">);</span>
246 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">q2</span><span class="special">(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">u2</span><span class="special">);</span>
251 the various algebraic operations between scalars, units, and quantities give
255 <pre class="programlisting"><span class="identifier">S1</span> <span class="special">:</span> <span class="number">2</span>
256 <span class="identifier">X1</span> <span class="special">:</span> <span class="number">2</span>
257 <span class="identifier">X2</span> <span class="special">:</span> <span class="special">(</span><span class="number">4</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
258 <span class="identifier">U1</span> <span class="special">:</span> <span class="identifier">N</span>
259 <span class="identifier">U2</span> <span class="special">:</span> <span class="identifier">J</span>
260 <span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">N</span>
261 <span class="identifier">Q2</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">J</span>
266 Scalar/unit operations :
270 <pre class="programlisting"><span class="identifier">U1</span><span class="special">*</span><span class="identifier">S1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">N</span>
271 <span class="identifier">S1</span><span class="special">*</span><span class="identifier">U1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">N</span>
272 <span class="identifier">U1</span><span class="special">/</span><span class="identifier">S1</span> <span class="special">:</span> <span class="number">0.5</span> <span class="identifier">N</span>
273 <span class="identifier">S1</span><span class="special">/</span><span class="identifier">U1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">kg</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">s</span><span class="special">^</span><span class="number">2</span>
278 Unit/unit operations and integral/rational powers of units :
282 <pre class="programlisting"><span class="identifier">U1</span><span class="special">+</span><span class="identifier">U1</span> <span class="special">:</span> <span class="identifier">N</span>
283 <span class="identifier">U1</span><span class="special">-</span><span class="identifier">U1</span> <span class="special">:</span> <span class="identifier">N</span>
284 <span class="identifier">U1</span><span class="special">*</span><span class="identifier">U1</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
285 <span class="identifier">U1</span><span class="special">/</span><span class="identifier">U1</span> <span class="special">:</span> <span class="identifier">dimensionless</span>
286 <span class="identifier">U1</span><span class="special">*</span><span class="identifier">U2</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
287 <span class="identifier">U1</span><span class="special">/</span><span class="identifier">U2</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span>
288 <span class="identifier">U1</span><span class="special">^</span><span class="identifier">X</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
289 <span class="identifier">X1vU1</span> <span class="special">:</span> <span class="identifier">m</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="identifier">kg</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="identifier">s</span><span class="special">^-</span><span class="number">1</span>
290 <span class="identifier">U1</span><span class="special">^</span><span class="identifier">X2</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">4</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">4</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">s</span><span class="special">^(-</span><span class="number">8</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
291 <span class="identifier">X2vU1</span> <span class="special">:</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">4</span><span class="special">)</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">4</span><span class="special">)</span> <span class="identifier">s</span><span class="special">^(-</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
296 Scalar/quantity operations :
300 <pre class="programlisting"><span class="identifier">Q1</span><span class="special">*</span><span class="identifier">S1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">N</span>
301 <span class="identifier">S1</span><span class="special">*</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">N</span>
302 <span class="identifier">Q1</span><span class="special">/</span><span class="identifier">S1</span> <span class="special">:</span> <span class="number">0.5</span> <span class="identifier">N</span>
303 <span class="identifier">S1</span><span class="special">/</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">kg</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">s</span><span class="special">^</span><span class="number">2</span>
308 Unit/quantity operations :
312 <pre class="programlisting"><span class="identifier">U1</span><span class="special">*</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
313 <span class="identifier">Q1</span><span class="special">*</span><span class="identifier">U1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
314 <span class="identifier">U1</span><span class="special">/</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">dimensionless</span>
315 <span class="identifier">Q1</span><span class="special">/</span><span class="identifier">U1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">dimensionless</span>
320 Quantity/quantity operations and integral/rational powers of quantities :
324 <pre class="programlisting"><span class="special">+</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">N</span>
325 <span class="special">-</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="special">-</span><span class="number">1</span> <span class="identifier">N</span>
326 <span class="identifier">Q1</span><span class="special">+</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">N</span>
327 <span class="identifier">Q1</span><span class="special">-</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">0</span> <span class="identifier">N</span>
328 <span class="identifier">Q1</span><span class="special">*</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
329 <span class="identifier">Q1</span><span class="special">/</span><span class="identifier">Q1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">dimensionless</span>
330 <span class="identifier">Q1</span><span class="special">*</span><span class="identifier">Q2</span> <span class="special">:</span> <span class="number">2</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
331 <span class="identifier">Q1</span><span class="special">/</span><span class="identifier">Q2</span> <span class="special">:</span> <span class="number">0.5</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span>
332 <span class="identifier">Q1</span><span class="special">^</span><span class="identifier">X1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span><span class="special">^</span><span class="number">2</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">4</span>
333 <span class="identifier">X1vQ1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</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="identifier">kg</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="identifier">s</span><span class="special">^-</span><span class="number">1</span>
334 <span class="identifier">Q1</span><span class="special">^</span><span class="identifier">X2</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">4</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">4</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">s</span><span class="special">^(-</span><span class="number">8</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
335 <span class="identifier">X2vQ1</span> <span class="special">:</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">4</span><span class="special">)</span> <span class="identifier">kg</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">4</span><span class="special">)</span> <span class="identifier">s</span><span class="special">^(-</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
340 Logical comparison operators are also defined between quantities :
344 <pre class="programlisting"><span class="comment">/// check comparison tests</span>
345 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">l1</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">meter</span><span class="special">),</span>
346 <span class="identifier">l2</span><span class="special">(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">);</span>
355 <pre class="programlisting"><span class="identifier">l1</span> <span class="special">==</span> <span class="identifier">l2</span> <span class="keyword">false</span>
356 <span class="identifier">l1</span> <span class="special">!=</span> <span class="identifier">l2</span> <span class="keyword">true</span>
357 <span class="identifier">l1</span> <span class="special"><=</span> <span class="identifier">l2</span> <span class="keyword">true</span>
358 <span class="identifier">l1</span> <span class="special"><</span> <span class="identifier">l2</span> <span class="keyword">true</span>
359 <span class="identifier">l1</span> <span class="special">>=</span> <span class="identifier">l2</span> <span class="keyword">false</span>
360 <span class="identifier">l1</span> <span class="special">></span> <span class="identifier">l2</span> <span class="keyword">false</span>
365 Implicit conversion is allowed between dimensionless quantities and their
366 corresponding value types :
370 <pre class="programlisting"><span class="comment">/// check implicit unit conversion from dimensionless to value_type </span>
371 <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">dimless</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">q1</span><span class="special">/</span><span class="identifier">q1</span><span class="special">);</span>
376 A generic function for computing mechanical work can be defined that takes
377 force and distance arguments in an arbitrary unit system and returns energy
382 <pre class="programlisting"><span class="comment">/// the physical definition of work - computed for an arbitrary unit system </span>
383 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">System</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
384 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">energy_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">Y</span><span class="special">></span>
385 <span class="identifier">work</span><span class="special">(</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">force_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">Y</span><span class="special">></span> <span class="identifier">F</span><span class="special">,</span>
386 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">Y</span><span class="special">></span> <span class="identifier">dx</span><span class="special">)</span>
387 <span class="special">{</span>
388 <span class="keyword">return</span> <span class="identifier">F</span><span class="special">*</span><span class="identifier">dx</span><span class="special">;</span>
389 <span class="special">}</span>
395 <pre class="programlisting"><span class="comment">/// test calcuation of work</span>
396 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">force</span><span class="special">></span> <span class="identifier">F</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">newton</span><span class="special">);</span>
397 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">dx</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">meter</span><span class="special">);</span>
398 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">E</span><span class="special">(</span><span class="identifier">work</span><span class="special">(</span><span class="identifier">F</span><span class="special">,</span><span class="identifier">dx</span><span class="special">));</span>
403 which functions as expected for SI quantities :
407 <pre class="programlisting"><span class="identifier">F</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">N</span>
408 <span class="identifier">dx</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">m</span>
409 <span class="identifier">E</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">J</span>
414 The ideal gas law can also be implemented in SI units :
418 <pre class="programlisting"><span class="comment">/// the ideal gas law in si units</span>
419 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
420 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">amount</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span>
421 <span class="identifier">idealGasLaw</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">pressure</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">P</span><span class="special">,</span>
422 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">volume</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">V</span><span class="special">,</span>
423 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">T</span><span class="special">)</span>
424 <span class="special">{</span>
425 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">si</span><span class="special">;</span>
427 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">constants</span><span class="special">::</span><span class="identifier">codata</span><span class="special">;</span>
428 <span class="keyword">return</span> <span class="special">(</span><span class="identifier">P</span><span class="special">*</span><span class="identifier">V</span><span class="special">/(</span><span class="identifier">R</span><span class="special">*</span><span class="identifier">T</span><span class="special">));</span>
429 <span class="special">}</span>
435 <pre class="programlisting"><span class="comment">/// test ideal gas law</span>
436 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">temperature</span><span class="special">></span> <span class="identifier">T</span> <span class="special">=</span> <span class="special">(</span><span class="number">273.</span><span class="special">+</span><span class="number">37.</span><span class="special">)*</span><span class="identifier">kelvin</span><span class="special">;</span>
437 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">pressure</span><span class="special">></span> <span class="identifier">P</span> <span class="special">=</span> <span class="number">1.01325e5</span><span class="special">*</span><span class="identifier">pascals</span><span class="special">;</span>
438 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">r</span> <span class="special">=</span> <span class="number">0.5e-6</span><span class="special">*</span><span class="identifier">meters</span><span class="special">;</span>
439 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">volume</span><span class="special">></span> <span class="identifier">V</span> <span class="special">=</span> <span class="special">(</span><span class="number">4.0</span><span class="special">/</span><span class="number">3.0</span><span class="special">)*</span><span class="number">3.141592</span><span class="special">*</span><span class="identifier">pow</span><span class="special"><</span><span class="number">3</span><span class="special">>(</span><span class="identifier">r</span><span class="special">);</span>
440 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">amount</span><span class="special">></span> <span class="identifier">n</span><span class="special">(</span><span class="identifier">idealGasLaw</span><span class="special">(</span><span class="identifier">P</span><span class="special">,</span><span class="identifier">V</span><span class="special">,</span><span class="identifier">T</span><span class="special">));</span>
445 with the resulting output :
449 <pre class="programlisting"><span class="identifier">r</span> <span class="special">=</span> <span class="number">5e-07</span> <span class="identifier">m</span>
450 <span class="identifier">P</span> <span class="special">=</span> <span class="number">101325</span> <span class="identifier">Pa</span>
451 <span class="identifier">V</span> <span class="special">=</span> <span class="number">5.23599e-19</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
452 <span class="identifier">T</span> <span class="special">=</span> <span class="number">310</span> <span class="identifier">K</span>
453 <span class="identifier">n</span> <span class="special">=</span> <span class="number">2.05835e-17</span> <span class="identifier">mol</span>
454 <span class="identifier">R</span> <span class="special">=</span> <span class="number">8.314472</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span> <span class="identifier">K</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">mol</span><span class="special">^-</span><span class="number">1</span> <span class="special">(</span><span class="identifier">rel</span><span class="special">.</span> <span class="identifier">unc</span><span class="special">.</span> <span class="special">=</span> <span class="number">1.8e-06</span><span class="special">)</span>
459 Trigonometric and inverse trigonometric functions can be implemented for
460 any unit system that provides an angular base dimension. For radians, these
461 functions are found in <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.cmath_hpp" title="Header <boost/units/cmath.hpp>">boost/units/cmath.hpp</a></code>
462 These behave as one expects, with trigonometric functions taking an angular
463 quantity and returning a dimensionless quantity, while the inverse trigonometric
464 functions take a dimensionless quantity and return an angular quantity :
467 Defining a few angular quantities,
471 <pre class="programlisting"><span class="comment">/// test trig stuff</span>
472 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">plane_angle</span><span class="special">></span> <span class="identifier">theta</span> <span class="special">=</span> <span class="number">0.375</span><span class="special">*</span><span class="identifier">radians</span><span class="special">;</span>
473 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">dimensionless</span><span class="special">></span> <span class="identifier">sin_theta</span> <span class="special">=</span> <span class="identifier">sin</span><span class="special">(</span><span class="identifier">theta</span><span class="special">);</span>
474 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">plane_angle</span><span class="special">></span> <span class="identifier">thetap</span> <span class="special">=</span> <span class="identifier">asin</span><span class="special">(</span><span class="identifier">sin_theta</span><span class="special">);</span>
483 <pre class="programlisting"><span class="identifier">theta</span> <span class="special">=</span> <span class="number">0.375</span> <span class="identifier">rd</span>
484 <span class="identifier">sin</span><span class="special">(</span><span class="identifier">theta</span><span class="special">)</span> <span class="special">=</span> <span class="number">0.366273</span> <span class="identifier">dimensionless</span>
485 <span class="identifier">asin</span><span class="special">(</span><span class="identifier">sin</span><span class="special">(</span><span class="identifier">theta</span><span class="special">))</span> <span class="special">=</span> <span class="number">0.375</span> <span class="identifier">rd</span>
490 Dealing with complex quantities is trivial. Here is the calculation of complex
495 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">electric_potential</span><span class="special">,</span><span class="identifier">complex_type</span><span class="special">></span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">complex_type</span><span class="special">(</span><span class="number">12.5</span><span class="special">,</span><span class="number">0.0</span><span class="special">)*</span><span class="identifier">volts</span><span class="special">;</span>
496 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">current</span><span class="special">,</span><span class="identifier">complex_type</span><span class="special">></span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">complex_type</span><span class="special">(</span><span class="number">3.0</span><span class="special">,</span><span class="number">4.0</span><span class="special">)*</span><span class="identifier">amperes</span><span class="special">;</span>
497 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">resistance</span><span class="special">,</span><span class="identifier">complex_type</span><span class="special">></span> <span class="identifier">z</span> <span class="special">=</span> <span class="identifier">complex_type</span><span class="special">(</span><span class="number">1.5</span><span class="special">,-</span><span class="number">2.0</span><span class="special">)*</span><span class="identifier">ohms</span><span class="special">;</span>
506 <pre class="programlisting"><span class="identifier">V</span> <span class="special">=</span> <span class="special">(</span><span class="number">12.5</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">V</span>
507 <span class="identifier">I</span> <span class="special">=</span> <span class="special">(</span><span class="number">3</span><span class="special">,</span><span class="number">4</span><span class="special">)</span> <span class="identifier">A</span>
508 <span class="identifier">Z</span> <span class="special">=</span> <span class="special">(</span><span class="number">1.5</span><span class="special">,-</span><span class="number">2</span><span class="special">)</span> <span class="identifier">Ohm</span>
509 <span class="identifier">I</span><span class="special">*</span><span class="identifier">Z</span> <span class="special">=</span> <span class="special">(</span><span class="number">12.5</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">V</span>
513 <div class="section">
514 <div class="titlepage"><div><div><h4 class="title">
515 <a name="boost_units.Examples.KitchenSinkExample.UDT_Quantities"></a><a class="link" href="Examples.html#boost_units.Examples.KitchenSinkExample.UDT_Quantities" title="User-defined value types">User-defined
517 </h4></div></div></div>
519 User-defined value types that support the appropriate arithmetic operations
520 are automatically supported as quantity value types. The operators that
521 are supported by default for quantity value types are unary plus, unary
522 minus, addition, subtraction, multiplication, division, equal-to, not-equal-to,
523 less-than, less-or-equal-to, greater-than, and greater-or-equal-to. Support
524 for rational powers and roots can be added by overloading the <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/power_typeof_helper.html" title="Struct template power_typeof_helper">power_typeof_helper</a></code></span>
525 and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/root_typeof_helper.html" title="Struct template root_typeof_helper">root_typeof_helper</a></code></span>
526 classes. Here we implement a user-defined <code class="computeroutput"><span class="identifier">measurement</span></code>
527 class that models a numerical measurement with an associated measurement
528 error and the appropriate algebra and demonstrates its use as a quantity
529 value type; the full code is found in <a href="../../../libs/units/example/measurement.hpp" target="_top">measurement.hpp</a>.
532 Then, defining some <code class="computeroutput"><span class="identifier">measurement</span></code>
533 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
538 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">,</span><span class="identifier">measurement</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span>
539 <span class="identifier">u</span><span class="special">(</span><span class="identifier">measurement</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">1.0</span><span class="special">,</span><span class="number">0.0</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">),</span>
540 <span class="identifier">w</span><span class="special">(</span><span class="identifier">measurement</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">4.52</span><span class="special">,</span><span class="number">0.02</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">),</span>
541 <span class="identifier">x</span><span class="special">(</span><span class="identifier">measurement</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">2.0</span><span class="special">,</span><span class="number">0.2</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">),</span>
542 <span class="identifier">y</span><span class="special">(</span><span class="identifier">measurement</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">3.0</span><span class="special">,</span><span class="number">0.6</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">);</span>
551 <pre class="programlisting"><span class="identifier">x</span><span class="special">+</span><span class="identifier">y</span><span class="special">-</span><span class="identifier">w</span> <span class="special">=</span> <span class="number">0.48</span><span class="special">(+/-</span><span class="number">0.632772</span><span class="special">)</span> <span class="identifier">m</span>
552 <span class="identifier">w</span><span class="special">*</span><span class="identifier">x</span> <span class="special">=</span> <span class="number">9.04</span><span class="special">(+/-</span><span class="number">0.904885</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
553 <span class="identifier">x</span><span class="special">/</span><span class="identifier">y</span> <span class="special">=</span> <span class="number">0.666667</span><span class="special">(+/-</span><span class="number">0.149071</span><span class="special">)</span> <span class="identifier">dimensionless</span>
558 If we implement the overloaded helper classes for rational powers and roots
559 then we can also compute rational powers of measurement quantities :
563 <pre class="programlisting"><span class="identifier">w</span><span class="special">*</span><span class="identifier">y</span><span class="special">^</span><span class="number">2</span><span class="special">/(</span><span class="identifier">u</span><span class="special">*</span><span class="identifier">x</span><span class="special">)^</span><span class="number">2</span> <span class="special">=</span> <span class="number">10.17</span><span class="special">(+/-</span><span class="number">3.52328</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span>
564 <span class="identifier">w</span><span class="special">/(</span><span class="identifier">u</span><span class="special">*</span><span class="identifier">x</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="special">=</span> <span class="number">3.19612</span><span class="special">(+/-</span><span class="number">0.160431</span><span class="special">)</span> <span class="identifier">dimensionless</span>
570 <div class="section">
571 <div class="titlepage"><div><div><h3 class="title">
572 <a name="boost_units.Examples.ConversionExample"></a><a class="link" href="Examples.html#boost_units.Examples.ConversionExample" title="Conversion Example">Conversion Example</a>
573 </h3></div></div></div>
575 (<a href="../../../libs/units/example/conversion.cpp" target="_top">conversion.cpp</a>)
578 This example demonstrates the various allowed conversions between SI and
579 CGS units. Defining some quantities
583 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">L1</span> <span class="special">=</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span><span class="keyword">int</span><span class="special">>(</span><span class="keyword">int</span><span class="special">(</span><span class="number">2.5</span><span class="special">)*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">);</span>
584 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">L2</span><span class="special">(</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span><span class="keyword">double</span><span class="special">>(</span><span class="number">2.5</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">));</span>
589 illustrates implicit conversion of quantities of different value types where
590 implicit conversion of the value types themselves is allowed. N.B. The conversion
591 from double to int is treated as an explicit conversion because there is
592 no way to emulate the exact behavior of the built-in conversion. Explicit
593 constructors allow conversions for two cases:
595 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
596 explicit casting of a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
597 to a different <code class="computeroutput"><span class="identifier">value_type</span></code>
602 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">L3</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span><span class="keyword">int</span><span class="special">></span> <span class="special">>(</span><span class="identifier">L1</span><span class="special">);</span>
606 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
607 and explicit casting of a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
608 to a different unit :
612 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">L4</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="special">>(</span><span class="identifier">L1</span><span class="special">);</span>
617 giving the following output :
621 <pre class="programlisting"><span class="identifier">L1</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span>
622 <span class="identifier">L2</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span>
623 <span class="identifier">L3</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span>
624 <span class="identifier">L4</span> <span class="special">=</span> <span class="number">200</span> <span class="identifier">cm</span>
625 <span class="identifier">L5</span> <span class="special">=</span> <span class="number">5</span> <span class="identifier">m</span>
626 <span class="identifier">L6</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span>
627 <span class="identifier">L7</span> <span class="special">=</span> <span class="number">200</span> <span class="identifier">cm</span>
632 A few more explicit unit system conversions :
636 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">volume</span><span class="special">></span> <span class="identifier">vs</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">pow</span><span class="special"><</span><span class="number">3</span><span class="special">>(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">));</span>
637 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">volume</span><span class="special">></span> <span class="identifier">vc</span><span class="special">(</span><span class="identifier">vs</span><span class="special">);</span>
638 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">volume</span><span class="special">></span> <span class="identifier">vs2</span><span class="special">(</span><span class="identifier">vc</span><span class="special">);</span>
640 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">es</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">joule</span><span class="special">);</span>
641 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">ec</span><span class="special">(</span><span class="identifier">es</span><span class="special">);</span>
642 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">es2</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
644 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">velocity</span><span class="special">></span> <span class="identifier">v1</span> <span class="special">=</span> <span class="number">2.0</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">/</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">,</span>
645 <span class="identifier">v2</span><span class="special">(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">centimeters</span><span class="special">/</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">second</span><span class="special">);</span>
650 which produces the following output:
654 <pre class="programlisting"><span class="identifier">volume</span> <span class="special">(</span><span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
655 <span class="identifier">volume</span> <span class="special">(</span><span class="identifier">cm</span><span class="special">^</span><span class="number">3</span><span class="special">)</span> <span class="special">=</span> <span class="number">1e+06</span> <span class="identifier">cm</span><span class="special">^</span><span class="number">3</span>
656 <span class="identifier">volume</span> <span class="special">(</span><span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
658 <span class="identifier">energy</span> <span class="special">(</span><span class="identifier">joules</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">J</span>
659 <span class="identifier">energy</span> <span class="special">(</span><span class="identifier">ergs</span><span class="special">)</span> <span class="special">=</span> <span class="number">1e+07</span> <span class="identifier">erg</span>
660 <span class="identifier">energy</span> <span class="special">(</span><span class="identifier">joules</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">J</span>
662 <span class="identifier">velocity</span> <span class="special">(</span><span class="number">2</span> <span class="identifier">m</span><span class="special">/</span><span class="identifier">s</span><span class="special">)</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">1</span>
663 <span class="identifier">velocity</span> <span class="special">(</span><span class="number">2</span> <span class="identifier">cm</span><span class="special">/</span><span class="identifier">s</span><span class="special">)</span> <span class="special">=</span> <span class="number">0.02</span> <span class="identifier">m</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">1</span>
668 <div class="section">
669 <div class="titlepage"><div><div><h3 class="title">
670 <a name="boost_units.Examples.UDTExample"></a><a class="link" href="Examples.html#boost_units.Examples.UDTExample" title="User Defined Types">User Defined Types</a>
671 </h3></div></div></div>
673 (<a href="../../../libs/units/example/quaternion.cpp" target="_top">quaternion.cpp</a>)
676 This example demonstrates the use of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span></code>
677 as a value type for <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
678 and the converse. For the first case, we first define specializations of
679 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/power_typeof_helper.html" title="Struct template power_typeof_helper">power_typeof_helper</a></code></span>
680 and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/root_typeof_helper.html" title="Struct template root_typeof_helper">root_typeof_helper</a></code></span>
681 for powers and roots, respectively:
685 <pre class="programlisting"><span class="comment">/// specialize power typeof helper</span>
686 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
687 <span class="keyword">struct</span> <span class="identifier">power_typeof_helper</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">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
688 <span class="special">{</span>
689 <span class="comment">// boost::math::quaternion only supports integer powers</span>
690 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">D</span><span class="special">==</span><span class="number">1</span><span class="special">);</span>
692 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span>
693 <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span>
694 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
696 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
697 <span class="special">{</span>
698 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">pow</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">N</span><span class="special">));</span>
699 <span class="special">}</span>
700 <span class="special">};</span>
706 <pre class="programlisting"><span class="comment">/// specialize root typeof helper</span>
707 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
708 <span class="keyword">struct</span> <span class="identifier">root_typeof_helper</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">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
709 <span class="special">{</span>
710 <span class="comment">// boost::math::quaternion only supports integer powers</span>
711 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">N</span><span class="special">==</span><span class="number">1</span><span class="special">);</span>
713 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span>
714 <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span>
715 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
717 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
718 <span class="special">{</span>
719 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">pow</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">D</span><span class="special">));</span>
720 <span class="special">}</span>
721 <span class="special">};</span>
726 We can now declare a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
727 of a <code class="computeroutput"><span class="identifier">quaternion</span></code> :
731 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">,</span><span class="identifier">quaternion</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">length_dimension</span><span class="special">;</span>
733 <span class="identifier">length_dimension</span> <span class="identifier">L</span><span class="special">(</span><span class="identifier">quaternion</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">4.0</span><span class="special">,</span><span class="number">3.0</span><span class="special">,</span><span class="number">2.0</span><span class="special">,</span><span class="number">1.0</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">);</span>
738 so that all operations that are defined in the <code class="computeroutput"><span class="identifier">quaternion</span></code>
739 class behave correctly. If rational powers were defined for this class, it
740 would be possible to compute rational powers and roots with no additional
745 <pre class="programlisting"><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">4</span><span class="special">,</span><span class="number">3</span><span class="special">,</span><span class="number">2</span><span class="special">,</span><span class="number">1</span><span class="special">)</span> <span class="identifier">m</span>
746 <span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(-</span><span class="number">4</span><span class="special">,-</span><span class="number">3</span><span class="special">,-</span><span class="number">2</span><span class="special">,-</span><span class="number">1</span><span class="special">)</span> <span class="identifier">m</span>
747 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">8</span><span class="special">,</span><span class="number">6</span><span class="special">,</span><span class="number">4</span><span class="special">,</span><span class="number">2</span><span class="special">)</span> <span class="identifier">m</span>
748 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">m</span>
749 <span class="identifier">L</span><span class="special">*</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="number">24</span><span class="special">,</span><span class="number">16</span><span class="special">,</span><span class="number">8</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
750 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">)</span> <span class="identifier">dimensionless</span>
751 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="special">(-</span><span class="number">104</span><span class="special">,</span><span class="number">102</span><span class="special">,</span><span class="number">68</span><span class="special">,</span><span class="number">34</span><span class="special">)</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
756 Now, if for some reason we preferred the <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span> to be the value
757 type of the <code class="computeroutput"><span class="identifier">quaternion</span></code> class
762 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="special">></span> <span class="identifier">length_dimension</span><span class="special">;</span>
764 <span class="identifier">length_dimension</span> <span class="identifier">L</span><span class="special">(</span><span class="number">4.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">,</span><span class="number">3.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">,</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">,</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">);</span>
769 Here, the unary plus and minus and addition and subtraction operators function
770 correctly. Unfortunately, the multiplication and division operations fail
771 because <code class="computeroutput"><span class="identifier">quaternion</span></code> implements
772 them in terms of the <code class="computeroutput"><span class="special">*=</span></code> and
773 <code class="computeroutput"><span class="special">/=</span></code> operators, respectively,
774 which are incapable of representing the heterogeneous unit algebra needed
775 for quantities (an identical problem occurs with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>,
776 for the same reason). In order to compute rational powers and roots, we need
777 to specialize <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/power_typeof_helper.html" title="Struct template power_typeof_helper">power_typeof_helper</a></code></span>
778 and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/root_typeof_helper.html" title="Struct template root_typeof_helper">root_typeof_helper</a></code></span>
783 <pre class="programlisting"><span class="comment">/// specialize power typeof helper for quaternion<quantity<Unit,Y> ></span>
784 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Unit</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
785 <span class="keyword">struct</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span>
786 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>,</span>
787 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
788 <span class="special">{</span>
789 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span>
790 <span class="identifier">Y</span><span class="special">,</span>
791 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span>
792 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span>
794 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span>
795 <span class="identifier">Unit</span><span class="special">,</span>
796 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span>
797 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span>
799 <span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit_type</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">quantity_type</span><span class="special">;</span>
800 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity_type</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
802 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
803 <span class="special">{</span>
804 <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">tmp</span> <span class="special">=</span>
805 <span class="identifier">pow</span><span class="special"><</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></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">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>(</span>
806 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_1</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
807 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_2</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
808 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_3</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
809 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_4</span><span class="special">().</span><span class="identifier">value</span><span class="special">()));</span>
811 <span class="keyword">return</span> <span class="identifier">type</span><span class="special">(</span><span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_1</span><span class="special">()),</span>
812 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_2</span><span class="special">()),</span>
813 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_3</span><span class="special">()),</span>
814 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_4</span><span class="special">()));</span>
815 <span class="special">}</span>
816 <span class="special">};</span>
822 <pre class="programlisting"><span class="comment">/// specialize root typeof helper for quaternion<quantity<Unit,Y> ></span>
823 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Unit</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
824 <span class="keyword">struct</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span>
825 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>,</span>
826 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
827 <span class="special">{</span>
828 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span>
829 <span class="identifier">Y</span><span class="special">,</span>
830 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span>
831 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span>
833 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span>
834 <span class="identifier">Unit</span><span class="special">,</span>
835 <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span>
836 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span>
838 <span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit_type</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">quantity_type</span><span class="special">;</span>
839 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity_type</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
841 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
842 <span class="special">{</span>
843 <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quaternion</span><span class="special"><</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">tmp</span> <span class="special">=</span>
844 <span class="identifier">root</span><span class="special"><</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></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">quaternion</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>(</span>
845 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_1</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
846 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_2</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
847 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_3</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
848 <span class="identifier">x</span><span class="special">.</span><span class="identifier">R_component_4</span><span class="special">().</span><span class="identifier">value</span><span class="special">()));</span>
850 <span class="keyword">return</span> <span class="identifier">type</span><span class="special">(</span><span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_1</span><span class="special">()),</span>
851 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_2</span><span class="special">()),</span>
852 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_3</span><span class="special">()),</span>
853 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">R_component_4</span><span class="special">()));</span>
854 <span class="special">}</span>
855 <span class="special">};</span>
864 <pre class="programlisting"><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">4</span> <span class="identifier">m</span><span class="special">,</span><span class="number">3</span> <span class="identifier">m</span><span class="special">,</span><span class="number">2</span> <span class="identifier">m</span><span class="special">,</span><span class="number">1</span> <span class="identifier">m</span><span class="special">)</span>
865 <span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(-</span><span class="number">4</span> <span class="identifier">m</span><span class="special">,-</span><span class="number">3</span> <span class="identifier">m</span><span class="special">,-</span><span class="number">2</span> <span class="identifier">m</span><span class="special">,-</span><span class="number">1</span> <span class="identifier">m</span><span class="special">)</span>
866 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">8</span> <span class="identifier">m</span><span class="special">,</span><span class="number">6</span> <span class="identifier">m</span><span class="special">,</span><span class="number">4</span> <span class="identifier">m</span><span class="special">,</span><span class="number">2</span> <span class="identifier">m</span><span class="special">)</span>
867 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">(</span><span class="number">0</span> <span class="identifier">m</span><span class="special">,</span><span class="number">0</span> <span class="identifier">m</span><span class="special">,</span><span class="number">0</span> <span class="identifier">m</span><span class="special">,</span><span class="number">0</span> <span class="identifier">m</span><span class="special">)</span>
868 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="special">(-</span><span class="number">104</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">,</span><span class="number">102</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">,</span><span class="number">68</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">,</span><span class="number">34</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span><span class="special">)</span>
873 <div class="section">
874 <div class="titlepage"><div><div><h3 class="title">
875 <a name="boost_units.Examples.ComplexExample"></a><a class="link" href="Examples.html#boost_units.Examples.ComplexExample" title="Complex Example">Complex Example</a>
876 </h3></div></div></div>
878 (<a href="../../../libs/units/example/complex.cpp" target="_top">complex.cpp</a>)
881 This example demonstrates how to implement a replacement <code class="computeroutput"><span class="identifier">complex</span></code>
882 class that functions correctly both as a quantity value type and as a quantity
883 container class, including heterogeneous multiplication and division operations
884 and rational powers and roots. Naturally, heterogeneous operations are only
885 supported on compilers that implement <code class="computeroutput"><span class="identifier">typeof</span></code>.
886 The primary differences are that binary operations are not implemented using
887 the <code class="computeroutput"><span class="identifier">op</span><span class="special">=</span></code>
888 operators and use the utility classes <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/add_typeof_helper.html" title="Struct template add_typeof_helper">add_typeof_helper</a></code></span>,
889 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/subtract_typeof_helper.html" title="Struct template subtract_typeof_helper">subtract_typeof_helper</a></code></span>,
890 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/multiply_typeof_helper.html" title="Struct template multiply_typeof_helper">multiply_typeof_helper</a></code></span>,
891 and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/divide_typeof_helper.html" title="Struct template divide_typeof_helper">divide_typeof_helper</a></code></span>.
892 In addition, <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/power_typeof_helper.html" title="Struct template power_typeof_helper">power_typeof_helper</a></code></span>
893 and <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/root_typeof_helper.html" title="Struct template root_typeof_helper">root_typeof_helper</a></code></span>
894 are defined for both cases :
898 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
900 <span class="keyword">namespace</span> <span class="identifier">units</span> <span class="special">{</span>
902 <span class="comment">/// replacement complex class </span>
903 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
904 <span class="keyword">class</span> <span class="identifier">complex</span>
905 <span class="special">{</span>
906 <span class="keyword">public</span><span class="special">:</span>
907 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">this_type</span><span class="special">;</span>
909 <span class="identifier">complex</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">r</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">r_</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span><span class="identifier">i_</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
910 <span class="identifier">complex</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">r_</span><span class="special">(</span><span class="identifier">source</span><span class="special">.</span><span class="identifier">r_</span><span class="special">),</span><span class="identifier">i_</span><span class="special">(</span><span class="identifier">source</span><span class="special">.</span><span class="identifier">i_</span><span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
912 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span>
913 <span class="special">{</span>
914 <span class="keyword">if</span> <span class="special">(</span><span class="keyword">this</span> <span class="special">==</span> <span class="special">&</span><span class="identifier">source</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
916 <span class="identifier">r_</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">r_</span><span class="special">;</span>
917 <span class="identifier">i_</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">i_</span><span class="special">;</span>
919 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
920 <span class="special">}</span>
922 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">real</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">r_</span><span class="special">;</span> <span class="special">}</span>
923 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">imag</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">i_</span><span class="special">;</span> <span class="special">}</span>
925 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">real</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">r_</span><span class="special">;</span> <span class="special">}</span>
926 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">imag</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">i_</span><span class="special">;</span> <span class="special">}</span>
928 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">val</span><span class="special">)</span>
929 <span class="special">{</span>
930 <span class="identifier">r_</span> <span class="special">+=</span> <span class="identifier">val</span><span class="special">;</span>
931 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
932 <span class="special">}</span>
934 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">-=(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">val</span><span class="special">)</span>
935 <span class="special">{</span>
936 <span class="identifier">r_</span> <span class="special">-=</span> <span class="identifier">val</span><span class="special">;</span>
937 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
938 <span class="special">}</span>
940 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*=(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">val</span><span class="special">)</span>
941 <span class="special">{</span>
942 <span class="identifier">r_</span> <span class="special">*=</span> <span class="identifier">val</span><span class="special">;</span>
943 <span class="identifier">i_</span> <span class="special">*=</span> <span class="identifier">val</span><span class="special">;</span>
944 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
945 <span class="special">}</span>
947 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">/=(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">val</span><span class="special">)</span>
948 <span class="special">{</span>
949 <span class="identifier">r_</span> <span class="special">/=</span> <span class="identifier">val</span><span class="special">;</span>
950 <span class="identifier">i_</span> <span class="special">/=</span> <span class="identifier">val</span><span class="special">;</span>
951 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
952 <span class="special">}</span>
954 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span>
955 <span class="special">{</span>
956 <span class="identifier">r_</span> <span class="special">+=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">r_</span><span class="special">;</span>
957 <span class="identifier">i_</span> <span class="special">+=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">i_</span><span class="special">;</span>
958 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
959 <span class="special">}</span>
961 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">-=(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span>
962 <span class="special">{</span>
963 <span class="identifier">r_</span> <span class="special">-=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">r_</span><span class="special">;</span>
964 <span class="identifier">i_</span> <span class="special">-=</span> <span class="identifier">source</span><span class="special">.</span><span class="identifier">i_</span><span class="special">;</span>
965 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
966 <span class="special">}</span>
968 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*=(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span>
969 <span class="special">{</span>
970 <span class="special">*</span><span class="keyword">this</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span> <span class="special">*</span> <span class="identifier">source</span><span class="special">;</span>
971 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
972 <span class="special">}</span>
974 <span class="identifier">this_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">/=(</span><span class="keyword">const</span> <span class="identifier">this_type</span><span class="special">&</span> <span class="identifier">source</span><span class="special">)</span>
975 <span class="special">{</span>
976 <span class="special">*</span><span class="keyword">this</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span> <span class="special">/</span> <span class="identifier">source</span><span class="special">;</span>
977 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
978 <span class="special">}</span>
980 <span class="keyword">private</span><span class="special">:</span>
981 <span class="identifier">T</span> <span class="identifier">r_</span><span class="special">,</span><span class="identifier">i_</span><span class="special">;</span>
982 <span class="special">};</span>
984 <span class="special">}</span>
986 <span class="special">}</span>
988 <span class="preprocessor">#if</span> <span class="identifier">BOOST_UNITS_HAS_BOOST_TYPEOF</span>
990 <span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span>
992 <span class="identifier">BOOST_TYPEOF_REGISTER_TEMPLATE</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">complex</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span>
994 <span class="preprocessor">#endif</span>
996 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
998 <span class="keyword">namespace</span> <span class="identifier">units</span> <span class="special">{</span>
1000 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">></span>
1001 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">unary_plus_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1002 <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1003 <span class="special">{</span>
1004 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">unary_plus_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1006 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1007 <span class="special">}</span>
1009 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">></span>
1010 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">unary_minus_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1011 <span class="keyword">operator</span><span class="special">-(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1012 <span class="special">{</span>
1013 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">unary_minus_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1015 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>(-</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),-</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1016 <span class="special">}</span>
1018 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1019 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">add_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1020 <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span>
1021 <span class="special">{</span>
1022 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">add_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1024 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()+</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()+</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1025 <span class="special">}</span>
1027 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1028 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">subtract_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1029 <span class="keyword">operator</span><span class="special">-(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span>
1030 <span class="special">{</span>
1031 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">subtract_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1033 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()-</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()-</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1034 <span class="special">}</span>
1036 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1037 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">multiply_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1038 <span class="keyword">operator</span><span class="special">*(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span>
1039 <span class="special">{</span>
1040 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">multiply_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1042 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">(),</span>
1043 <span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">());</span>
1045 <span class="comment">// fully correct implementation has more complex return type</span>
1046 <span class="comment">//</span>
1047 <span class="comment">// typedef typename boost::units::multiply_typeof_helper<X,Y>::type xy_type;</span>
1048 <span class="comment">// </span>
1049 <span class="comment">// typedef typename boost::units::add_typeof_helper<</span>
1050 <span class="comment">// xy_type,xy_type>::type xy_plus_xy_type;</span>
1051 <span class="comment">// typedef typename</span>
1052 <span class="comment">// boost::units::subtract_typeof_helper<xy_type,xy_type>::type</span>
1053 <span class="comment">// xy_minus_xy_type;</span>
1054 <span class="comment">// </span>
1055 <span class="comment">// BOOST_STATIC_ASSERT((boost::is_same<xy_plus_xy_type,</span>
1056 <span class="comment">// xy_minus_xy_type>::value == true));</span>
1057 <span class="comment">// </span>
1058 <span class="comment">// return complex<xy_plus_xy_type>(x.real()*y.real()-x.imag()*y.imag(),</span>
1059 <span class="comment">// x.real()*y.imag()+x.imag()*y.real());</span>
1060 <span class="special">}</span>
1062 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1063 <span class="identifier">complex</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">divide_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span>
1064 <span class="keyword">operator</span><span class="special">/(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">X</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span>
1065 <span class="special">{</span>
1066 <span class="comment">// naive implementation of complex division</span>
1067 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">divide_typeof_helper</span><span class="special"><</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
1069 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">type</span><span class="special">>((</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()+</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">())/</span>
1070 <span class="special">(</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()+</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()),</span>
1071 <span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()-</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">())/</span>
1072 <span class="special">(</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">real</span><span class="special">()+</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()*</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()));</span>
1074 <span class="comment">// fully correct implementation has more complex return type</span>
1075 <span class="comment">//</span>
1076 <span class="comment">// typedef typename boost::units::multiply_typeof_helper<X,Y>::type xy_type;</span>
1077 <span class="comment">// typedef typename boost::units::multiply_typeof_helper<Y,Y>::type yy_type;</span>
1078 <span class="comment">//</span>
1079 <span class="comment">// typedef typename boost::units::add_typeof_helper<xy_type, xy_type>::type</span>
1080 <span class="comment">// xy_plus_xy_type;</span>
1081 <span class="comment">// typedef typename boost::units::subtract_typeof_helper<</span>
1082 <span class="comment">// xy_type,xy_type>::type xy_minus_xy_type;</span>
1083 <span class="comment">//</span>
1084 <span class="comment">// typedef typename boost::units::divide_typeof_helper<</span>
1085 <span class="comment">// xy_plus_xy_type,yy_type>::type xy_plus_xy_over_yy_type;</span>
1086 <span class="comment">// typedef typename boost::units::divide_typeof_helper<</span>
1087 <span class="comment">// xy_minus_xy_type,yy_type>::type xy_minus_xy_over_yy_type;</span>
1088 <span class="comment">//</span>
1089 <span class="comment">// BOOST_STATIC_ASSERT((boost::is_same<xy_plus_xy_over_yy_type,</span>
1090 <span class="comment">// xy_minus_xy_over_yy_type>::value == true));</span>
1091 <span class="comment">//</span>
1092 <span class="comment">// return complex<xy_plus_xy_over_yy_type>(</span>
1093 <span class="comment">// (x.real()*y.real()+x.imag()*y.imag())/</span>
1094 <span class="comment">// (y.real()*y.real()+y.imag()*y.imag()),</span>
1095 <span class="comment">// (x.imag()*y.real()-x.real()*y.imag())/</span>
1096 <span class="comment">// (y.real()*y.real()+y.imag()*y.imag()));</span>
1097 <span class="special">}</span>
1099 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1100 <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">></span>
1101 <span class="identifier">pow</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">Y</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span>
1102 <span class="special">{</span>
1103 <span class="identifier">std</span><span class="special">::</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">></span> <span class="identifier">tmp</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1105 <span class="identifier">tmp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pow</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">,</span><span class="identifier">y</span><span class="special">);</span>
1107 <span class="keyword">return</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">real</span><span class="special">(),</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">imag</span><span class="special">());</span>
1108 <span class="special">}</span>
1110 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span>
1111 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">val</span><span class="special">)</span>
1112 <span class="special">{</span>
1113 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">.</span><span class="identifier">real</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" + "</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" i"</span><span class="special">;</span>
1115 <span class="keyword">return</span> <span class="identifier">os</span><span class="special">;</span>
1116 <span class="special">}</span>
1118 <span class="comment">/// specialize power typeof helper for complex<Y></span>
1119 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
1120 <span class="keyword">struct</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
1121 <span class="special">{</span>
1122 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span>
1123 <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span>
1124 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
1126 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1127 <span class="special">{</span>
1128 <span class="keyword">const</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="identifier">rat</span><span class="special">;</span>
1130 <span class="keyword">const</span> <span class="identifier">Y</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">Y</span><span class="special">(</span><span class="identifier">rat</span><span class="special">.</span><span class="identifier">numerator</span><span class="special">())/</span><span class="identifier">Y</span><span class="special">(</span><span class="identifier">rat</span><span class="special">.</span><span class="identifier">denominator</span><span class="special">());</span>
1132 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">pow</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">m</span><span class="special">);</span>
1133 <span class="special">}</span>
1134 <span class="special">};</span>
1136 <span class="comment">/// specialize root typeof helper for complex<Y></span>
1137 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
1138 <span class="keyword">struct</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
1139 <span class="special">{</span>
1140 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span>
1141 <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span>
1142 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
1144 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1145 <span class="special">{</span>
1146 <span class="keyword">const</span> <span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="identifier">rat</span><span class="special">;</span>
1148 <span class="keyword">const</span> <span class="identifier">Y</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">Y</span><span class="special">(</span><span class="identifier">rat</span><span class="special">.</span><span class="identifier">denominator</span><span class="special">())/</span><span class="identifier">Y</span><span class="special">(</span><span class="identifier">rat</span><span class="special">.</span><span class="identifier">numerator</span><span class="special">());</span>
1150 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">pow</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">m</span><span class="special">);</span>
1151 <span class="special">}</span>
1152 <span class="special">};</span>
1154 <span class="comment">/// specialize power typeof helper for complex<quantity<Unit,Y> ></span>
1155 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Unit</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
1156 <span class="keyword">struct</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
1157 <span class="special">{</span>
1158 <span class="keyword">typedef</span> <span class="keyword">typename</span>
1159 <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span>
1160 <span class="keyword">typedef</span> <span class="keyword">typename</span>
1161 <span class="identifier">power_typeof_helper</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span>
1162 <span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit_type</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">quantity_type</span><span class="special">;</span>
1163 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity_type</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
1165 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1166 <span class="special">{</span>
1167 <span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">tmp</span> <span class="special">=</span>
1168 <span class="identifier">pow</span><span class="special"><</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>(</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
1169 <span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">().</span><span class="identifier">value</span><span class="special">()));</span>
1171 <span class="keyword">return</span> <span class="identifier">type</span><span class="special">(</span><span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">real</span><span class="special">()),</span>
1172 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()));</span>
1173 <span class="special">}</span>
1174 <span class="special">};</span>
1176 <span class="comment">/// specialize root typeof helper for complex<quantity<Unit,Y> ></span>
1177 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">Unit</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">D</span><span class="special">></span>
1178 <span class="keyword">struct</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">></span>
1179 <span class="special">{</span>
1180 <span class="keyword">typedef</span> <span class="keyword">typename</span>
1181 <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">Y</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span>
1182 <span class="keyword">typedef</span> <span class="keyword">typename</span>
1183 <span class="identifier">root_typeof_helper</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span>
1184 <span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit_type</span><span class="special">,</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">quantity_type</span><span class="special">;</span>
1185 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity_type</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span>
1187 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">Unit</span><span class="special">,</span><span class="identifier">Y</span><span class="special">></span> <span class="special">>&</span> <span class="identifier">x</span><span class="special">)</span>
1188 <span class="special">{</span>
1189 <span class="keyword">const</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">value_type</span><span class="special">></span> <span class="identifier">tmp</span> <span class="special">=</span>
1190 <span class="identifier">root</span><span class="special"><</span><span class="identifier">static_rational</span><span class="special"><</span><span class="identifier">N</span><span class="special">,</span><span class="identifier">D</span><span class="special">></span> <span class="special">>(</span><span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">>(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">real</span><span class="special">().</span><span class="identifier">value</span><span class="special">(),</span>
1191 <span class="identifier">x</span><span class="special">.</span><span class="identifier">imag</span><span class="special">().</span><span class="identifier">value</span><span class="special">()));</span>
1193 <span class="keyword">return</span> <span class="identifier">type</span><span class="special">(</span><span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">real</span><span class="special">()),</span>
1194 <span class="identifier">quantity_type</span><span class="special">::</span><span class="identifier">from_value</span><span class="special">(</span><span class="identifier">tmp</span><span class="special">.</span><span class="identifier">imag</span><span class="special">()));</span>
1195 <span class="special">}</span>
1196 <span class="special">};</span>
1198 <span class="special">}</span> <span class="comment">// namespace units</span>
1200 <span class="special">}</span> <span class="comment">// namespace boost</span>
1205 With this replacement <code class="computeroutput"><span class="identifier">complex</span></code>
1206 class, we can declare a complex variable :
1210 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">,</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">length_dimension</span><span class="special">;</span>
1212 <span class="identifier">length_dimension</span> <span class="identifier">L</span><span class="special">(</span><span class="identifier">complex</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">2.0</span><span class="special">,</span><span class="number">1.0</span><span class="special">)*</span><span class="identifier">meters</span><span class="special">);</span>
1217 to get the correct behavior for all cases supported by <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span> with a <code class="computeroutput"><span class="identifier">complex</span></code> value type :
1221 <pre class="programlisting"><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">2</span> <span class="special">+</span> <span class="number">1</span> <span class="identifier">i</span> <span class="identifier">m</span>
1222 <span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">-</span><span class="number">2</span> <span class="special">+</span> <span class="special">-</span><span class="number">1</span> <span class="identifier">i</span> <span class="identifier">m</span>
1223 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">4</span> <span class="special">+</span> <span class="number">2</span> <span class="identifier">i</span> <span class="identifier">m</span>
1224 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">0</span> <span class="special">+</span> <span class="number">0</span> <span class="identifier">i</span> <span class="identifier">m</span>
1225 <span class="identifier">L</span><span class="special">*</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">3</span> <span class="special">+</span> <span class="number">4</span> <span class="identifier">i</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
1226 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">1</span> <span class="special">+</span> <span class="number">0</span> <span class="identifier">i</span> <span class="identifier">dimensionless</span>
1227 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="number">2</span> <span class="special">+</span> <span class="number">11</span> <span class="identifier">i</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span>
1228 <span class="identifier">L</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">=</span> <span class="number">2.56713</span> <span class="special">+</span> <span class="number">2.14247</span> <span class="identifier">i</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span>
1229 <span class="number">3</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.29207</span> <span class="special">+</span> <span class="number">0.201294</span> <span class="identifier">i</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
1230 <span class="special">(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.62894</span> <span class="special">+</span> <span class="number">0.520175</span> <span class="identifier">i</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span>
1235 and, similarly, <code class="computeroutput"><span class="identifier">complex</span></code> with
1236 a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
1241 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="special">></span> <span class="identifier">length_dimension</span><span class="special">;</span>
1243 <span class="identifier">length_dimension</span> <span class="identifier">L</span><span class="special">(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">,</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">meters</span><span class="special">);</span>
1252 <pre class="programlisting"><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span> <span class="special">+</span> <span class="number">1</span> <span class="identifier">m</span> <span class="identifier">i</span>
1253 <span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="special">-</span><span class="number">2</span> <span class="identifier">m</span> <span class="special">+</span> <span class="special">-</span><span class="number">1</span> <span class="identifier">m</span> <span class="identifier">i</span>
1254 <span class="identifier">L</span><span class="special">+</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span> <span class="special">+</span> <span class="number">2</span> <span class="identifier">m</span> <span class="identifier">i</span>
1255 <span class="identifier">L</span><span class="special">-</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">0</span> <span class="identifier">m</span> <span class="special">+</span> <span class="number">0</span> <span class="identifier">m</span> <span class="identifier">i</span>
1256 <span class="identifier">L</span><span class="special">*</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">3</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="special">+</span> <span class="number">4</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> <span class="identifier">i</span>
1257 <span class="identifier">L</span><span class="special">/</span><span class="identifier">L</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">dimensionless</span> <span class="special">+</span> <span class="number">0</span> <span class="identifier">dimensionless</span> <span class="identifier">i</span>
1258 <span class="identifier">L</span><span class="special">^</span><span class="number">3</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span> <span class="special">+</span> <span class="number">11</span> <span class="identifier">m</span><span class="special">^</span><span class="number">3</span> <span class="identifier">i</span>
1259 <span class="identifier">L</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">=</span> <span class="number">2.56713</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="special">+</span> <span class="number">2.14247</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span> <span class="identifier">i</span>
1260 <span class="number">3</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.29207</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="number">0.201294</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">1</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">i</span>
1261 <span class="special">(</span><span class="number">3</span><span class="special">/</span><span class="number">2</span><span class="special">)</span><span class="identifier">vL</span> <span class="special">=</span> <span class="number">1.62894</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="number">0.520175</span> <span class="identifier">m</span><span class="special">^(</span><span class="number">2</span><span class="special">/</span><span class="number">3</span><span class="special">)</span> <span class="identifier">i</span>
1266 <div class="section">
1267 <div class="titlepage"><div><div><h3 class="title">
1268 <a name="boost_units.Examples.PerformanceExample"></a><a class="link" href="Examples.html#boost_units.Examples.PerformanceExample" title="Performance Example">Performance
1270 </h3></div></div></div>
1272 (<a href="../../../libs/units/example/performance.cpp" target="_top">performance.cpp</a>)
1275 This example provides an ad hoc performance test to verify that zero runtime
1276 overhead is incurred when using <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span>
1277 in place of <code class="computeroutput"><span class="keyword">double</span></code>. Note that
1278 performance optimization and testing is not trivial, so some care must be
1279 taken in profiling. It is also critical to have a compiler capable of optimizing
1280 the many template instantiations and inline calls effectively to achieve
1281 maximal performance. Zero overhead for this test has been verified using
1282 gcc 4.0.1, and icc 9.0, 10.0, and 10.1 on Mac OS 10.4 and 10.5, and using
1283 msvc 8.0 on Windows XP.
1286 <div class="section">
1287 <div class="titlepage"><div><div><h3 class="title">
1288 <a name="boost_units.Examples.RadarBeamHeightExample"></a><a class="link" href="Examples.html#boost_units.Examples.RadarBeamHeightExample" title="Radar Beam Height">Radar Beam
1290 </h3></div></div></div>
1292 (<a href="../../../libs/units/example/radar_beam_height.cpp" target="_top">radar_beam_height.cpp</a>)
1295 This example demonstrates the implementation of two non-SI units of length,
1300 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">nautical</span> <span class="special">{</span>
1302 <span class="keyword">struct</span> <span class="identifier">length_base_unit</span> <span class="special">:</span>
1303 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">base_unit</span><span class="special"><</span><span class="identifier">length_base_unit</span><span class="special">,</span> <span class="identifier">length_dimension</span><span class="special">,</span> <span class="number">1</span><span class="special">></span>
1304 <span class="special">{</span>
1305 <span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"nautical mile"</span><span class="special">;</span> <span class="special">}</span>
1306 <span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">symbol</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"nmi"</span><span class="special">;</span> <span class="special">}</span>
1307 <span class="special">};</span>
1309 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">make_system</span><span class="special"><</span><span class="identifier">length_base_unit</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">system</span><span class="special">;</span>
1311 <span class="comment">/// unit typedefs</span>
1312 <span class="keyword">typedef</span> <span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">system</span><span class="special">></span> <span class="identifier">length</span><span class="special">;</span>
1314 <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">length</span> <span class="identifier">mile</span><span class="special">,</span><span class="identifier">miles</span><span class="special">;</span>
1316 <span class="special">}</span> <span class="comment">// namespace nautical</span>
1318 <span class="comment">// helper for conversions between nautical length and si length</span>
1319 <span class="identifier">BOOST_UNITS_DEFINE_CONVERSION_FACTOR</span><span class="special">(</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length_base_unit</span><span class="special">,</span>
1320 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter_base_unit</span><span class="special">,</span>
1321 <span class="keyword">double</span><span class="special">,</span> <span class="number">1.852e3</span><span class="special">);</span>
1326 and the imperial foot :
1330 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">imperial</span> <span class="special">{</span>
1332 <span class="keyword">struct</span> <span class="identifier">length_base_unit</span> <span class="special">:</span>
1333 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">base_unit</span><span class="special"><</span><span class="identifier">length_base_unit</span><span class="special">,</span> <span class="identifier">length_dimension</span><span class="special">,</span> <span class="number">2</span><span class="special">></span>
1334 <span class="special">{</span>
1335 <span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"foot"</span><span class="special">;</span> <span class="special">}</span>
1336 <span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">symbol</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"ft"</span><span class="special">;</span> <span class="special">}</span>
1337 <span class="special">};</span>
1339 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">make_system</span><span class="special"><</span><span class="identifier">length_base_unit</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">system</span><span class="special">;</span>
1341 <span class="comment">/// unit typedefs</span>
1342 <span class="keyword">typedef</span> <span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">system</span><span class="special">></span> <span class="identifier">length</span><span class="special">;</span>
1344 <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">length</span> <span class="identifier">foot</span><span class="special">,</span><span class="identifier">feet</span><span class="special">;</span>
1346 <span class="special">}</span> <span class="comment">// imperial</span>
1348 <span class="comment">// helper for conversions between imperial length and si length</span>
1349 <span class="identifier">BOOST_UNITS_DEFINE_CONVERSION_FACTOR</span><span class="special">(</span><span class="identifier">imperial</span><span class="special">::</span><span class="identifier">length_base_unit</span><span class="special">,</span>
1350 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter_base_unit</span><span class="special">,</span>
1351 <span class="keyword">double</span><span class="special">,</span> <span class="number">1.0</span><span class="special">/</span><span class="number">3.28083989501312</span><span class="special">);</span>
1356 These units include conversions between themselves and the meter. Three functions
1357 for computing radar beam height from radar range and the local earth radius
1358 are defined. The first takes arguments in one system and returns a value
1359 in the same system :
1363 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">System</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
1364 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">T</span><span class="special">></span>
1365 <span class="identifier">radar_beam_height</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">radar_range</span><span class="special">,</span>
1366 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">earth_radius</span><span class="special">,</span>
1367 <span class="identifier">T</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">4.0</span><span class="special">/</span><span class="number">3.0</span><span class="special">)</span>
1368 <span class="special">{</span>
1369 <span class="keyword">return</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System</span><span class="special">>,</span><span class="identifier">T</span><span class="special">></span>
1370 <span class="special">(</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">radar_range</span><span class="special">)/(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">k</span><span class="special">*</span><span class="identifier">earth_radius</span><span class="special">));</span>
1371 <span class="special">}</span>
1376 The second is similar, but is templated on return type, so that the arguments
1377 are converted to the return unit system internally :
1381 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">return_type</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">System1</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">System2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
1382 <span class="identifier">return_type</span>
1383 <span class="identifier">radar_beam_height</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System1</span><span class="special">>,</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">radar_range</span><span class="special">,</span>
1384 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">unit</span><span class="special"><</span><span class="identifier">length_dimension</span><span class="special">,</span><span class="identifier">System2</span><span class="special">>,</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">earth_radius</span><span class="special">,</span>
1385 <span class="identifier">T</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">4.0</span><span class="special">/</span><span class="number">3.0</span><span class="special">)</span>
1386 <span class="special">{</span>
1387 <span class="comment">// need to decide which system to use for calculation</span>
1388 <span class="keyword">const</span> <span class="identifier">return_type</span> <span class="identifier">rr</span><span class="special">(</span><span class="identifier">radar_range</span><span class="special">),</span>
1389 <span class="identifier">er</span><span class="special">(</span><span class="identifier">earth_radius</span><span class="special">);</span>
1391 <span class="keyword">return</span> <span class="identifier">return_type</span><span class="special">(</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">rr</span><span class="special">)/(</span><span class="number">2.0</span><span class="special">*</span><span class="identifier">k</span><span class="special">*</span><span class="identifier">er</span><span class="special">));</span>
1392 <span class="special">}</span>
1397 Finally, the third function is an empirical approximation that is only valid
1398 for radar ranges specified in nautical miles, returning beam height in feet.
1399 This function uses the heterogeneous unit of nautical miles per square root
1400 of feet to ensure dimensional correctness :
1404 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">imperial</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span>
1405 <span class="identifier">radar_beam_height</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">>&</span> <span class="identifier">range</span><span class="special">)</span>
1406 <span class="special">{</span>
1407 <span class="keyword">return</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">imperial</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span>
1408 <span class="special">(</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">range</span><span class="special">/(</span><span class="number">1.23</span><span class="special">*</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">miles</span><span class="special">/</span><span class="identifier">root</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">imperial</span><span class="special">::</span><span class="identifier">feet</span><span class="special">))));</span>
1409 <span class="special">}</span>
1414 With these, we can compute radar beam height in various unit systems :
1418 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">radar_range</span><span class="special">(</span><span class="number">300.0</span><span class="special">*</span><span class="identifier">miles</span><span class="special">);</span>
1419 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">earth_radius</span><span class="special">(</span><span class="number">6371.0087714</span><span class="special">*</span><span class="identifier">kilo</span><span class="special">*</span><span class="identifier">meters</span><span class="special">);</span>
1421 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">beam_height_1</span><span class="special">(</span><span class="identifier">radar_beam_height</span><span class="special">(</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">>(</span><span class="identifier">radar_range</span><span class="special">),</span><span class="identifier">earth_radius</span><span class="special">));</span>
1422 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">beam_height_2</span><span class="special">(</span><span class="identifier">radar_beam_height</span><span class="special">(</span><span class="identifier">radar_range</span><span class="special">,</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">>(</span><span class="identifier">earth_radius</span><span class="special">)));</span>
1423 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">beam_height_3</span><span class="special">(</span><span class="identifier">radar_beam_height</span><span class="special"><</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="special">>(</span><span class="identifier">radar_range</span><span class="special">,</span><span class="identifier">earth_radius</span><span class="special">));</span>
1424 <span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">beam_height_4</span><span class="special">(</span><span class="identifier">radar_beam_height</span><span class="special"><</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">nautical</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="special">>(</span><span class="identifier">radar_range</span><span class="special">,</span><span class="identifier">earth_radius</span><span class="special">));</span>
1433 <pre class="programlisting"><span class="identifier">radar</span> <span class="identifier">range</span> <span class="special">:</span> <span class="number">300</span> <span class="identifier">nmi</span>
1434 <span class="identifier">earth</span> <span class="identifier">radius</span> <span class="special">:</span> <span class="number">6.37101e+06</span> <span class="identifier">m</span>
1435 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="number">1</span> <span class="special">:</span> <span class="number">18169.7</span> <span class="identifier">m</span>
1436 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="number">2</span> <span class="special">:</span> <span class="number">9.81085</span> <span class="identifier">nmi</span>
1437 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="number">3</span> <span class="special">:</span> <span class="number">18169.7</span> <span class="identifier">m</span>
1438 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="number">4</span> <span class="special">:</span> <span class="number">9.81085</span> <span class="identifier">nmi</span>
1439 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="identifier">approx</span> <span class="special">:</span> <span class="number">59488.4</span> <span class="identifier">ft</span>
1440 <span class="identifier">beam</span> <span class="identifier">height</span> <span class="identifier">approx</span> <span class="special">:</span> <span class="number">18132.1</span> <span class="identifier">m</span>
1445 <div class="section">
1446 <div class="titlepage"><div><div><h3 class="title">
1447 <a name="boost_units.Examples.HeterogeneousUnitExample"></a><a class="link" href="Examples.html#boost_units.Examples.HeterogeneousUnitExample" title="Heterogeneous Unit Example">Heterogeneous
1449 </h3></div></div></div>
1451 (<a href="../../../libs/units/example/heterogeneous_unit.cpp" target="_top">heterogeneous_unit.cpp</a>)
1454 Mixed units and mixed unit conversions.
1461 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">L</span><span class="special">(</span><span class="number">1.5</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">);</span>
1462 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">mass</span><span class="special">></span> <span class="identifier">M</span><span class="special">(</span><span class="number">1.0</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">gram</span><span class="special">);</span>
1464 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">L</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1465 <span class="special"><<</span> <span class="identifier">M</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1466 <span class="special"><<</span> <span class="identifier">L</span><span class="special">*</span><span class="identifier">M</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1467 <span class="special"><<</span> <span class="identifier">L</span><span class="special">/</span><span class="identifier">M</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1468 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1470 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="number">1.0</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">kilogram</span><span class="special">/</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1471 <span class="special"><<</span> <span class="number">1.0</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">kilogram</span><span class="special">/</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)/</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span>
1472 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1474 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="number">1.0</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">centimeter</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">kilogram</span><span class="special">/</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1475 <span class="special"><<</span> <span class="number">1.0</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">centimeter</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">kilogram</span><span class="special">/</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)/</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span>
1476 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1485 <pre class="programlisting"><span class="number">1.5</span> <span class="identifier">m</span>
1486 <span class="number">1</span> <span class="identifier">g</span>
1487 <span class="number">1.5</span> <span class="identifier">m</span> <span class="identifier">g</span>
1488 <span class="number">1.5</span> <span class="identifier">m</span> <span class="identifier">g</span><span class="special">^-</span><span class="number">1</span>
1490 <span class="number">1</span> <span class="identifier">N</span>
1491 <span class="number">1</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
1493 <span class="number">1</span> <span class="identifier">cm</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
1494 <span class="number">1</span> <span class="identifier">cm</span> <span class="identifier">m</span><span class="special">^-</span><span class="number">1</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span>
1499 Arbitrary conversions also work:
1503 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">area</span><span class="special">></span> <span class="identifier">A</span><span class="special">(</span><span class="number">1.5</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">centimeter</span><span class="special">);</span>
1505 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="number">1.5</span><span class="special">*</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">*</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">centimeter</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1506 <span class="special"><<</span> <span class="identifier">A</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
1507 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1516 <pre class="programlisting"><span class="number">1.5</span> <span class="identifier">cm</span> <span class="identifier">m</span>
1517 <span class="number">0.015</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span>
1522 <div class="section">
1523 <div class="titlepage"><div><div><h3 class="title">
1524 <a name="boost_units.Examples.AbsoluteRelativeTemperatureExample"></a><a class="link" href="Examples.html#boost_units.Examples.AbsoluteRelativeTemperatureExample" title="Absolute and Relative Temperature Example">Absolute
1525 and Relative Temperature Example</a>
1526 </h3></div></div></div>
1528 (<a href="../../../libs/units/example/temperature.cpp" target="_top">temperature.cpp</a>)
1531 This example demonstrates using of absolute temperatures and relative temperature
1532 differences in Fahrenheit and converting between these and the Kelvin temperature
1533 scale. This issue touches on some surprisingly deep mathematical concepts
1534 (see <a href="http://en.wikipedia.org/wiki/Affine_space" target="_top">Wikipedia</a>
1535 for a basic review), but for our purposes here, we will simply observe that
1536 it is important to be able to differentiate between an absolute temperature
1537 measurement and a measurement of temperature difference. This is accomplished
1538 by using the <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/absolute.html" title="Class template absolute">absolute</a></code></span>
1542 First we define a system using the predefined fahrenheit base unit:
1546 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">temperature</span><span class="special">::</span><span class="identifier">fahrenheit_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span> <span class="identifier">temperature</span><span class="special">;</span>
1547 <span class="keyword">typedef</span> <span class="identifier">get_system</span><span class="special"><</span><span class="identifier">temperature</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">system</span><span class="special">;</span>
1549 <span class="identifier">BOOST_UNITS_STATIC_CONSTANT</span><span class="special">(</span><span class="identifier">degree</span><span class="special">,</span><span class="identifier">temperature</span><span class="special">);</span>
1550 <span class="identifier">BOOST_UNITS_STATIC_CONSTANT</span><span class="special">(</span><span class="identifier">degrees</span><span class="special">,</span><span class="identifier">temperature</span><span class="special">);</span>
1555 Now we can create some quantities:
1559 <pre class="programlisting"><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">fahrenheit</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">></span> <span class="identifier">T1p</span><span class="special">(</span>
1560 <span class="number">32.0</span><span class="special">*</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">fahrenheit</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">>());</span>
1561 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">fahrenheit</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="identifier">T1v</span><span class="special">(</span>
1562 <span class="number">32.0</span><span class="special">*</span><span class="identifier">fahrenheit</span><span class="special">::</span><span class="identifier">degrees</span><span class="special">);</span>
1564 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">></span> <span class="identifier">T2p</span><span class="special">(</span><span class="identifier">T1p</span><span class="special">);</span>
1565 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="identifier">T2v</span><span class="special">(</span><span class="identifier">T1v</span><span class="special">);</span>
1570 Note the use of <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/absolute.html" title="Class template absolute">absolute</a></code></span>
1571 to wrap a unit. The resulting output is:
1575 <pre class="programlisting"><span class="special">{</span> <span class="number">32</span> <span class="special">}</span> <span class="identifier">F</span>
1576 <span class="special">{</span> <span class="number">273.15</span> <span class="special">}</span> <span class="identifier">K</span>
1577 <span class="special">{</span> <span class="number">273.15</span> <span class="special">}</span> <span class="identifier">K</span>
1578 <span class="special">[</span> <span class="number">32</span> <span class="special">]</span> <span class="identifier">F</span>
1579 <span class="special">[</span> <span class="number">17.7778</span> <span class="special">]</span> <span class="identifier">K</span>
1580 <span class="special">[</span> <span class="number">17.7778</span> <span class="special">]</span> <span class="identifier">K</span>
1585 <div class="section">
1586 <div class="titlepage"><div><div><h3 class="title">
1587 <a name="boost_units.Examples.RuntimeConversionFactorExample"></a><a class="link" href="Examples.html#boost_units.Examples.RuntimeConversionFactorExample" title="Runtime Conversion Factor Example">Runtime
1588 Conversion Factor Example</a>
1589 </h3></div></div></div>
1591 (<a href="../../../libs/units/example/runtime_conversion_factor.cpp" target="_top">runtime_conversion_factor.cpp</a>)
1594 The Boost.Units library does not require that the conversion factors be compile
1595 time constants, as is demonstrated in this example:
1599 <pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">base_dimension</span><span class="special">;</span>
1600 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">base_unit</span><span class="special">;</span>
1602 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">currency_base</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
1604 <span class="keyword">struct</span> <span class="identifier">currency_base_dimension</span> <span class="special">:</span> <span class="identifier">base_dimension</span><span class="special"><</span><span class="identifier">currency_base_dimension</span><span class="special">,</span> <span class="number">1</span><span class="special">></span> <span class="special">{};</span>
1606 <span class="keyword">typedef</span> <span class="identifier">currency_base_dimension</span><span class="special">::</span><span class="identifier">dimension_type</span> <span class="identifier">currency_type</span><span class="special">;</span>
1608 <span class="keyword">template</span><span class="special"><</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">></span>
1609 <span class="keyword">struct</span> <span class="identifier">currency_base_unit</span> <span class="special">:</span>
1610 <span class="identifier">base_unit</span><span class="special"><</span><span class="identifier">currency_base_unit</span><span class="special"><</span><span class="identifier">N</span><span class="special">>,</span> <span class="identifier">currency_type</span><span class="special">,</span> <span class="identifier">currency_base</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">></span> <span class="special">{};</span>
1612 <span class="keyword">typedef</span> <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="number">0</span><span class="special">></span> <span class="identifier">us_dollar_base_unit</span><span class="special">;</span>
1613 <span class="keyword">typedef</span> <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="number">1</span><span class="special">></span> <span class="identifier">euro_base_unit</span><span class="special">;</span>
1615 <span class="keyword">typedef</span> <span class="identifier">us_dollar_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span> <span class="identifier">us_dollar</span><span class="special">;</span>
1616 <span class="keyword">typedef</span> <span class="identifier">euro_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span> <span class="identifier">euro</span><span class="special">;</span>
1618 <span class="comment">// an array of all possible conversions</span>
1619 <span class="keyword">double</span> <span class="identifier">conversion_factors</span><span class="special">[</span><span class="number">2</span><span class="special">][</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="special">{</span>
1620 <span class="special">{</span><span class="number">1.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">},</span>
1621 <span class="special">{</span><span class="number">1.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">}</span>
1622 <span class="special">};</span>
1624 <span class="keyword">double</span> <span class="identifier">get_conversion_factor</span><span class="special">(</span><span class="keyword">long</span> <span class="identifier">from</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">to</span><span class="special">)</span> <span class="special">{</span>
1625 <span class="keyword">return</span><span class="special">(</span><span class="identifier">conversion_factors</span><span class="special">[</span><span class="identifier">from</span><span class="special">][</span><span class="identifier">to</span><span class="special">]);</span>
1626 <span class="special">}</span>
1628 <span class="keyword">void</span> <span class="identifier">set_conversion_factor</span><span class="special">(</span><span class="keyword">long</span> <span class="identifier">from</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">to</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
1629 <span class="identifier">conversion_factors</span><span class="special">[</span><span class="identifier">from</span><span class="special">][</span><span class="identifier">to</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
1630 <span class="identifier">conversion_factors</span><span class="special">[</span><span class="identifier">to</span><span class="special">][</span><span class="identifier">from</span><span class="special">]</span> <span class="special">=</span> <span class="number">1.0</span> <span class="special">/</span> <span class="identifier">value</span><span class="special">;</span>
1631 <span class="special">}</span>
1633 <span class="identifier">BOOST_UNITS_DEFINE_CONVERSION_FACTOR_TEMPLATE</span><span class="special">((</span><span class="keyword">long</span> <span class="identifier">N1</span><span class="special">)(</span><span class="keyword">long</span> <span class="identifier">N2</span><span class="special">),</span>
1634 <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="identifier">N1</span><span class="special">>,</span>
1635 <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="identifier">N2</span><span class="special">>,</span>
1636 <span class="keyword">double</span><span class="special">,</span> <span class="identifier">get_conversion_factor</span><span class="special">(</span><span class="identifier">N1</span><span class="special">,</span> <span class="identifier">N2</span><span class="special">));</span>
1641 <div class="section">
1642 <div class="titlepage"><div><div><h3 class="title">
1643 <a name="boost_units.Examples.UnitsWithNonbaseDimensions"></a><a class="link" href="Examples.html#boost_units.Examples.UnitsWithNonbaseDimensions" title="Units with Non-base Dimensions">Units
1644 with Non-base Dimensions</a>
1645 </h3></div></div></div>
1647 (<a href="../../../libs/units/example/non_base_dimension.cpp" target="_top">non_base_dimension.cpp</a>)
1650 It is also possible to define base units that have derived rather than base
1655 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">imperial_gallon_tag</span> <span class="special">:</span>
1656 <span class="identifier">base_unit</span><span class="special"><</span><span class="identifier">imperial_gallon_tag</span><span class="special">,</span> <span class="identifier">volume_dimension</span><span class="special">,</span> <span class="number">1</span><span class="special">></span> <span class="special">{</span> <span class="special">};</span>
1658 <span class="keyword">typedef</span> <span class="identifier">make_system</span><span class="special"><</span><span class="identifier">imperial_gallon_tag</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">imperial</span><span class="special">;</span>
1660 <span class="keyword">typedef</span> <span class="identifier">unit</span><span class="special"><</span><span class="identifier">volume_dimension</span><span class="special">,</span><span class="identifier">imperial</span><span class="special">></span> <span class="identifier">imperial_gallon</span><span class="special">;</span>
1662 <span class="keyword">struct</span> <span class="identifier">us_gallon_tag</span> <span class="special">:</span> <span class="identifier">base_unit</span><span class="special"><</span><span class="identifier">us_gallon_tag</span><span class="special">,</span> <span class="identifier">volume_dimension</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">{</span> <span class="special">};</span>
1664 <span class="keyword">typedef</span> <span class="identifier">make_system</span><span class="special"><</span><span class="identifier">us_gallon_tag</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">us</span><span class="special">;</span>
1666 <span class="keyword">typedef</span> <span class="identifier">unit</span><span class="special"><</span><span class="identifier">volume_dimension</span><span class="special">,</span><span class="identifier">us</span><span class="special">></span> <span class="identifier">us_gallon</span><span class="special">;</span>
1671 <div class="section">
1672 <div class="titlepage"><div><div><h3 class="title">
1673 <a name="boost_units.Examples.OutputForCompositeUnits"></a><a class="link" href="Examples.html#boost_units.Examples.OutputForCompositeUnits" title="Output for Composite Units">Output
1674 for Composite Units</a>
1675 </h3></div></div></div>
1677 (<a href="../../../libs/units/example/composite_output.cpp" target="_top">composite_output.cpp</a>)
1680 If a unit has a special name and/or symbol, the free functions <code class="computeroutput"><span class="identifier">name_string</span></code> and <code class="computeroutput"><span class="identifier">symbol_string</span></code>
1681 can be overloaded directly.
1685 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name_string</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">cgs</span><span class="special">::</span><span class="identifier">force</span><span class="special">&)</span>
1686 <span class="special">{</span>
1687 <span class="keyword">return</span> <span class="string">"dyne"</span><span class="special">;</span>
1688 <span class="special">}</span>
1690 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">symbol_string</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">cgs</span><span class="special">::</span><span class="identifier">force</span><span class="special">&)</span>
1691 <span class="special">{</span>
1692 <span class="keyword">return</span> <span class="string">"dyn"</span><span class="special">;</span>
1693 <span class="special">}</span>
1698 In this case, any unit that reduces to the overloaded unit will be output
1699 with the replacement symbol.
1702 Special names and symbols for the SI and CGS unit systems are found in <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.systems.si.io_hpp" title="Header <boost/units/systems/si/io.hpp>">boost/units/systems/si/io.hpp</a></code>
1703 and <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.systems.cgs.io_hpp" title="Header <boost/units/systems/cgs/io.hpp>">boost/units/systems/cgs/io.hpp</a></code>,
1704 respectively. If these headers are not included, the output will simply follow
1705 default rules using the appropriate fundamental dimensions. Note that neither
1706 of these functions is defined for quantities because doing so would require
1707 making assumptions on how the corresponding value type should be formatted.
1710 Three <code class="computeroutput"><span class="identifier">ostream</span></code> formatters,
1711 <code class="computeroutput"><span class="identifier">symbol_format</span></code>, <code class="computeroutput"><span class="identifier">name_format</span></code>, and <code class="computeroutput"><span class="identifier">typename_format</span></code>
1712 are provided for convenience. These select the textual representation of
1713 units provided by <code class="computeroutput"><span class="identifier">symbol_string</span></code>
1714 or <code class="computeroutput"><span class="identifier">name_string</span></code> in the first
1715 two cases, while the latter returns a demangled typename for debugging purposes.
1716 Formatting of scaled unit is also done correctly.
1719 <div class="section">
1720 <div class="titlepage"><div><div><h3 class="title">
1721 <a name="boost_units.Examples.autoscale"></a><a class="link" href="Examples.html#boost_units.Examples.autoscale" title="Automatically Scaled Units">Automatically Scaled
1723 </h3></div></div></div>
1725 It is often desirable to scale a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/unit.html" title="Class template unit">unit</a></code></span>
1726 automatically, depending on its value, to keep the integral part in a limited
1727 range, usually between 1 and 999.
1730 For example, using <a href="http://en.wikipedia.org/wiki/Engineering_notation" target="_top">engineering
1731 notation prefixes</a>,
1733 <pre class="programlisting"><span class="string">"1234.5 m"</span> <span class="identifier">is</span> <span class="identifier">more</span> <span class="identifier">helpfully</span> <span class="identifier">displayed</span> <span class="identifier">as</span> <span class="string">"1.234 km"</span>
1734 <span class="string">"0.000000001234 m"</span> <span class="identifier">is</span> <span class="identifier">more</span> <span class="identifier">clearly</span> <span class="identifier">displayed</span> <span class="identifier">as</span> <span class="string">"1.2345 nanometer"</span><span class="special">.</span>
1737 The iostream manipulators <code class="computeroutput"><span class="identifier">engineering_prefixes</span></code>
1738 or <code class="computeroutput"><span class="identifier">binary_prefixes</span></code> make this
1743 <pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">binary_prefix</span><span class="special">;</span>
1744 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">engineering_prefix</span><span class="special">;</span>
1745 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">no_prefix</span><span class="special">;</span>
1747 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">2.345</span> <span class="special">*</span> <span class="identifier">meters</span><span class="special">;</span> <span class="comment">// A quantity of length, in units of meters.</span>
1748 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Outputs "2.345 m".</span>
1749 <span class="identifier">l</span> <span class="special">=</span> <span class="number">1000.0</span> <span class="special">*</span> <span class="identifier">l</span><span class="special">;</span> <span class="comment">// Increase it by 1000, so expect a k prefix.</span>
1750 <span class="comment">// Note that a double 1000.0 is required - an integer will fail to compile.</span>
1751 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Output autoprefixed with k to "2.345 km".</span>
1753 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">energy</span><span class="special">></span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">kilograms</span> <span class="special">*</span> <span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">l</span> <span class="special">/</span> <span class="identifier">seconds</span><span class="special">);</span> <span class="comment">// A quantity of energy.</span>
1754 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">e</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5.49902 MJ</span>
1755 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">name_format</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">e</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5.49902 megaJoule</span>
1760 (The complete set of <a href="http://physics.nist.gov/cuu/Units/prefixes.html" target="_top">engineering
1761 and scientific multiples</a> is not used (not centi or deci for example),
1762 but only powers of ten that are multiples of three, 10^3).
1765 Similarly, the equivalent <a href="http://en.wikipedia.org/wiki/Binary_prefixes" target="_top">binary
1766 prefixes</a> used for displaying computing kilobytes, megabytes, gigabytes...
1769 These are the 2^10 = 1024, 2^20 = 1 048 576, 2^30 ... multiples.
1772 (See also <a href="http://physics.nist.gov/cuu/Units/binary.html" target="_top">Prefixes
1773 for binary multiples</a>
1776 This scale is specified in IEC 60027-2, Second edition, 2000-11, Letter symbols
1777 to be used in electrical technology - Part 2: Telecommunications and electronics).
1781 <pre class="programlisting"><span class="comment">// Don't forget that the units name or symbol format specification is persistent.</span>
1782 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">symbol_format</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Resets the format to the default symbol format.</span>
1784 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">byte_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span><span class="special">></span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2048.</span> <span class="special">*</span> <span class="identifier">byte_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span><span class="special">();</span>
1785 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">b</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2.048 kb</span>
1786 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">symbol_format</span> <span class="special"><<</span> <span class="identifier">binary_prefix</span> <span class="special"><<</span> <span class="identifier">b</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// "2 Kib"</span>
1791 But note that scalar dimensionless values, like int, float and double, are
1792 <span class="bold"><strong>not</strong></span> prefixed automatically by the engineering_prefix
1793 or binary_prefix iostream manipulators.
1797 <pre class="programlisting"><span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">s1</span> <span class="special">=</span> <span class="number">2345.6</span><span class="special">;</span>
1798 <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">x1</span> <span class="special">=</span> <span class="number">23456</span><span class="special">;</span>
1799 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">s1</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2345.6</span>
1800 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">engineering_prefix</span> <span class="special"><<</span> <span class="identifier">x1</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 23456</span>
1802 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">binary_prefix</span> <span class="special"><<</span> <span class="identifier">s1</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2345.6</span>
1803 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">binary_prefix</span> <span class="special"><<</span> <span class="identifier">x1</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 23456</span>
1808 You can output the name or symbol of a unit (rather than the most common
1809 quantity of a unit).
1813 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">length</span> <span class="identifier">L</span><span class="special">;</span> <span class="comment">// A unit of length (but not a quantity of length).</span>
1814 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">L</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Default length unit is meter,</span>
1815 <span class="comment">// but default is symbol format so output is just "m".</span>
1816 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">name_format</span> <span class="special"><<</span> <span class="identifier">L</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// default length name is "meter".</span>
1821 Note too that all the formatting flags are persistent, so that if you set
1822 engineering_prefix, then it applies to all future outputs, until you select
1823 binary_prefix, or explicitly switch autoprefix off. You can specify no prefix
1824 (the default of course) in two ways:
1828 <pre class="programlisting"><span class="identifier">no_prefix</span><span class="special">(</span><span class="identifier">cout</span><span class="special">);</span> <span class="comment">// Clear any prefix flag.</span>
1829 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">no_prefix</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Clear any prefix flag using `no_prefix` manipulator.</span>
1834 And you can get the format flags for diagnosing problems.
1838 <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">get_autoprefix</span><span class="special">(</span><span class="identifier">cout</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 8 is `autoprefix_binary` from `enum autoprefix_mode`.</span>
1839 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">get_format</span><span class="special">(</span><span class="identifier">cout</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 1 is `name_fmt` from `enum format_mode`.</span>
1844 <div class="section">
1845 <div class="titlepage"><div><div><h3 class="title">
1846 <a name="boost_units.Examples.ConversionFactor"></a><a class="link" href="Examples.html#boost_units.Examples.ConversionFactor" title="Conversion Factor">Conversion Factor</a>
1847 </h3></div></div></div>
1849 This code demonstrates the use of the <code class="computeroutput"><span class="identifier">conversion_factor</span></code>
1850 free function to determine the scale factor between two units.
1853 (<a href="../../../libs/units/example/conversion_factor.cpp" target="_top">conversion_factor.cpp</a>)
1857 <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">dyne_to_newton</span> <span class="special">=</span>
1858 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">dyne</span><span class="special">,</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">newton</span><span class="special">);</span>
1859 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">dyne_to_newton</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1861 <span class="keyword">double</span> <span class="identifier">force_over_mass_conversion</span> <span class="special">=</span>
1862 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">newton</span><span class="special">/</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">kilogram</span><span class="special">,</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">dyne</span><span class="special">/</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">gram</span><span class="special">);</span>
1863 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">force_over_mass_conversion</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1865 <span class="keyword">double</span> <span class="identifier">momentum_conversion</span> <span class="special">=</span>
1866 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">momentum</span><span class="special">(),</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">momentum</span><span class="special">());</span>
1867 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">momentum_conversion</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1869 <span class="keyword">double</span> <span class="identifier">momentum_over_mass_conversion</span> <span class="special">=</span>
1870 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">momentum</span><span class="special">()/</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">mass</span><span class="special">(),</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">momentum</span><span class="special">()/</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">gram</span><span class="special">);</span>
1871 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">momentum_over_mass_conversion</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1873 <span class="keyword">double</span> <span class="identifier">acceleration_conversion</span> <span class="special">=</span>
1874 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">cgs</span><span class="special">::</span><span class="identifier">gal</span><span class="special">,</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">meter_per_second_squared</span><span class="special">);</span>
1875 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">acceleration_conversion</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1884 <pre class="programlisting"><span class="number">1e-005</span>
1885 <span class="number">100</span>
1886 <span class="number">1e-005</span>
1887 <span class="number">100</span>
1888 <span class="number">0.01</span>
1893 <div class="section">
1894 <div class="titlepage"><div><div><h3 class="title">
1895 <a name="boost_units.Examples.RuntimeUnits"></a><a class="link" href="Examples.html#boost_units.Examples.RuntimeUnits" title="Runtime Units">Runtime Units</a>
1896 </h3></div></div></div>
1898 (<a href="../../../libs/units/example/runtime_unit.cpp" target="_top">runtime_unit.cpp</a>)
1901 This example shows how to implement an interface that allow different units
1902 at runtime while still maintaining type safety for internal calculations.
1906 <pre class="programlisting"><span class="keyword">namespace</span> <span class="special">{</span>
1908 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">;</span>
1909 <span class="keyword">using</span> <span class="identifier">imperial</span><span class="special">::</span><span class="identifier">foot_base_unit</span><span class="special">;</span>
1911 <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="special">></span> <span class="identifier">known_units</span><span class="special">;</span>
1913 <span class="special">}</span>
1915 <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">calculate</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">)</span>
1916 <span class="special">{</span>
1917 <span class="keyword">return</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">hypot</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="number">2.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">));</span>
1918 <span class="special">}</span>
1920 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
1921 <span class="special">{</span>
1922 <span class="identifier">known_units</span><span class="special">[</span><span class="string">"meter"</span><span class="special">]</span> <span class="special">=</span> <span class="number">1.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">;</span>
1923 <span class="identifier">known_units</span><span class="special">[</span><span class="string">"centimeter"</span><span class="special">]</span> <span class="special">=</span> <span class="special">.</span><span class="number">01</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters</span><span class="special">;</span>
1924 <span class="identifier">known_units</span><span class="special">[</span><span class="string">"foot"</span><span class="special">]</span> <span class="special">=</span>
1925 <span class="identifier">conversion_factor</span><span class="special">(</span><span class="identifier">foot_base_unit</span><span class="special">::</span><span class="identifier">unit_type</span><span class="special">(),</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">;</span>
1927 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">output_type</span><span class="special">(</span><span class="string">"meter"</span><span class="special">);</span>
1928 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">;</span>
1930 <span class="keyword">while</span><span class="special">((</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"> "</span><span class="special">)</span> <span class="special">&&</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">input</span><span class="special">))</span>
1931 <span class="special">{</span>
1932 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">input</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">&&</span> <span class="identifier">input</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="char">'#'</span><span class="special">)</span>
1933 <span class="special">{</span>
1934 <span class="identifier">std</span><span class="special">::</span><span class="identifier">getline</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span><span class="special">,</span> <span class="identifier">input</span><span class="special">);</span>
1935 <span class="special">}</span>
1936 <span class="keyword">else</span> <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span> <span class="special">==</span> <span class="string">"exit"</span><span class="special">)</span>
1937 <span class="special">{</span>
1938 <span class="keyword">break</span><span class="special">;</span>
1939 <span class="special">}</span>
1940 <span class="keyword">else</span> <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span> <span class="special">==</span> <span class="string">"help"</span><span class="special">)</span>
1941 <span class="special">{</span>
1942 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"type \"exit\" to exit\n"</span>
1943 <span class="string">"type \"return 'unit'\" to set the return units\n"</span>
1944 <span class="string">"type \"'number' 'unit'\" to do a simple calculation"</span>
1945 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1946 <span class="special">}</span>
1947 <span class="keyword">else</span> <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span> <span class="special">==</span> <span class="string">"return"</span><span class="special">)</span>
1948 <span class="special">{</span>
1949 <span class="keyword">if</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">input</span><span class="special">)</span>
1950 <span class="special">{</span>
1951 <span class="keyword">if</span><span class="special">(</span><span class="identifier">known_units</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">input</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">known_units</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span>
1952 <span class="special">{</span>
1953 <span class="identifier">output_type</span> <span class="special">=</span> <span class="identifier">input</span><span class="special">;</span>
1954 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Done."</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1955 <span class="special">}</span>
1956 <span class="keyword">else</span>
1957 <span class="special">{</span>
1958 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Unknown unit \""</span> <span class="special"><<</span> <span class="identifier">input</span> <span class="special"><<</span> <span class="string">"\""</span>
1959 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1960 <span class="special">}</span>
1961 <span class="special">}</span>
1962 <span class="keyword">else</span>
1963 <span class="special">{</span>
1964 <span class="keyword">break</span><span class="special">;</span>
1965 <span class="special">}</span>
1966 <span class="special">}</span>
1967 <span class="keyword">else</span>
1968 <span class="special">{</span>
1969 <span class="keyword">try</span>
1970 <span class="special">{</span>
1971 <span class="keyword">double</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">input</span><span class="special">);</span>
1973 <span class="keyword">if</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">input</span><span class="special">)</span>
1974 <span class="special">{</span>
1975 <span class="keyword">if</span><span class="special">(</span><span class="identifier">known_units</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">input</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">known_units</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span>
1976 <span class="special">{</span>
1977 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span>
1978 <span class="identifier">calculate</span><span class="special">(</span><span class="identifier">value</span> <span class="special">*</span> <span class="identifier">known_units</span><span class="special">[</span><span class="identifier">input</span><span class="special">])</span> <span class="special">/</span>
1979 <span class="identifier">known_units</span><span class="special">[</span><span class="identifier">output_type</span><span class="special">])</span>
1980 <span class="special"><<</span> <span class="char">' '</span> <span class="special"><<</span> <span class="identifier">output_type</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1981 <span class="special">}</span>
1982 <span class="keyword">else</span>
1983 <span class="special">{</span>
1984 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Unknown unit \""</span> <span class="special"><<</span> <span class="identifier">input</span> <span class="special"><<</span> <span class="string">"\""</span>
1985 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1986 <span class="special">}</span>
1987 <span class="special">}</span>
1988 <span class="keyword">else</span>
1989 <span class="special">{</span>
1990 <span class="keyword">break</span><span class="special">;</span>
1991 <span class="special">}</span>
1992 <span class="special">}</span>
1993 <span class="keyword">catch</span><span class="special">(...)</span>
1994 <span class="special">{</span>
1995 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Input error"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
1996 <span class="special">}</span>
1997 <span class="special">}</span>
1998 <span class="special">}</span>
1999 <span class="special">}</span>
2004 <div class="section">
2005 <div class="titlepage"><div><div><h3 class="title">
2006 <a name="boost_units.Examples.lambda"></a><a class="link" href="Examples.html#boost_units.Examples.lambda" title="Interoperability with Boost.Lambda">Interoperability with Boost.Lambda</a>
2007 </h3></div></div></div>
2009 (<a href="../../../libs/units/example/lambda.cpp" target="_top">lambda.cpp</a>)
2012 The header <code class="computeroutput"><a class="link" href="Reference.html#header.boost.units.lambda_hpp" title="Header <boost/units/lambda.hpp>">boost/units/lambda.hpp</a></code>
2013 provides overloads and specializations needed to make Boost.Units usable
2014 with the Boost.Lambda library.
2018 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span> <span class="special">**</span><span class="identifier">argv</span><span class="special">)</span> <span class="special">{</span>
2020 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
2021 <span class="keyword">namespace</span> <span class="identifier">bl</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">;</span>
2022 <span class="keyword">namespace</span> <span class="identifier">bu</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">;</span>
2023 <span class="keyword">namespace</span> <span class="identifier">si</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">units</span><span class="special">::</span><span class="identifier">si</span><span class="special">;</span>
2026 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2027 <span class="comment">// Mechanical example: linear accelerated movement</span>
2028 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2030 <span class="comment">// Initial condition variables for acceleration, speed, and displacement</span>
2031 <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">acceleration</span><span class="special">></span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">2.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters_per_second_squared</span><span class="special">;</span>
2032 <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">velocity</span><span class="special">></span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">1.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters_per_second</span><span class="special">;</span>
2033 <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">s0</span> <span class="special">=</span> <span class="number">0.5</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">;</span>
2035 <span class="comment">// Displacement over time</span>
2036 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="special">(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">time</span><span class="special">>)</span> <span class="special">></span>
2037 <span class="identifier">s</span> <span class="special">=</span> <span class="number">0.5</span> <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">var</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span>
2038 <span class="special">+</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">var</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span>
2039 <span class="special">+</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">var</span><span class="special">(</span><span class="identifier">s0</span><span class="special">);</span>
2041 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Linear accelerated movement:"</span> <span class="special"><<</span> <span class="identifier">endl</span>
2042 <span class="special"><<</span> <span class="string">"a = "</span> <span class="special"><<</span> <span class="identifier">a</span> <span class="special"><<</span> <span class="string">", v = "</span> <span class="special"><<</span> <span class="identifier">v</span> <span class="special"><<</span> <span class="string">", s0 = "</span> <span class="special"><<</span> <span class="identifier">s0</span> <span class="special"><<</span> <span class="identifier">endl</span>
2043 <span class="special"><<</span> <span class="string">"s(1.0 * si::second) = "</span> <span class="special"><<</span> <span class="identifier">s</span><span class="special">(</span><span class="number">1.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span>
2044 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
2046 <span class="comment">// Change initial conditions</span>
2047 <span class="identifier">a</span> <span class="special">=</span> <span class="number">1.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters_per_second_squared</span><span class="special">;</span>
2048 <span class="identifier">v</span> <span class="special">=</span> <span class="number">2.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meters_per_second</span><span class="special">;</span>
2049 <span class="identifier">s0</span> <span class="special">=</span> <span class="special">-</span><span class="number">1.5</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">;</span>
2051 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a = "</span> <span class="special"><<</span> <span class="identifier">a</span> <span class="special"><<</span> <span class="string">", v = "</span> <span class="special"><<</span> <span class="identifier">v</span> <span class="special"><<</span> <span class="string">", s0 = "</span> <span class="special"><<</span> <span class="identifier">s0</span> <span class="special"><<</span> <span class="identifier">endl</span>
2052 <span class="special"><<</span> <span class="string">"s(1.0 * si::second) = "</span> <span class="special"><<</span> <span class="identifier">s</span><span class="special">(</span><span class="number">1.0</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span>
2053 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
2056 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2057 <span class="comment">// Electrical example: oscillating current</span>
2058 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2060 <span class="comment">// Constants for the current amplitude, frequency, and offset current</span>
2061 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">current</span><span class="special">></span> <span class="identifier">iamp</span> <span class="special">=</span> <span class="number">1.5</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">ampere</span><span class="special">;</span>
2062 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">frequency</span><span class="special">></span> <span class="identifier">f</span> <span class="special">=</span> <span class="number">1.0e3</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">hertz</span><span class="special">;</span>
2063 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">current</span><span class="special">></span> <span class="identifier">i0</span> <span class="special">=</span> <span class="number">0.5</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">ampere</span><span class="special">;</span>
2065 <span class="comment">// The invocation of the sin function needs to be postponed using</span>
2066 <span class="comment">// bind to specify the oscillation function. A lengthy static_cast</span>
2067 <span class="comment">// to the function pointer referencing boost::units::sin() is needed</span>
2068 <span class="comment">// to avoid an "unresolved overloaded function type" error.</span>
2069 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">current</span><span class="special">></span> <span class="special">(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">time</span><span class="special">>)</span> <span class="special">></span>
2070 <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">iamp</span>
2071 <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">dimensionless_quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">system</span><span class="special">,</span> <span class="keyword">double</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">(*)(</span><span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">plane_angle</span><span class="special">>&)>(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">sin</span><span class="special">),</span>
2072 <span class="number">2.0</span> <span class="special">*</span> <span class="identifier">pi</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">radian</span> <span class="special">*</span> <span class="identifier">f</span> <span class="special">*</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">)</span>
2073 <span class="special">+</span> <span class="identifier">i0</span><span class="special">;</span>
2075 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Oscillating current:"</span> <span class="special"><<</span> <span class="identifier">endl</span>
2076 <span class="special"><<</span> <span class="string">"iamp = "</span> <span class="special"><<</span> <span class="identifier">iamp</span> <span class="special"><<</span> <span class="string">", f = "</span> <span class="special"><<</span> <span class="identifier">f</span> <span class="special"><<</span> <span class="string">", i0 = "</span> <span class="special"><<</span> <span class="identifier">i0</span> <span class="special"><<</span> <span class="identifier">endl</span>
2077 <span class="special"><<</span> <span class="string">"i(1.25e-3 * si::second) = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">(</span><span class="number">1.25e-3</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">second</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span>
2078 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
2081 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2082 <span class="comment">// Geometric example: area calculation for a square</span>
2083 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2085 <span class="comment">// Length constant</span>
2086 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">></span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1.5</span> <span class="special">*</span> <span class="identifier">si</span><span class="special">::</span><span class="identifier">meter</span><span class="special">;</span>
2088 <span class="comment">// Again an ugly static_cast is needed to bind pow<2> to the first</span>
2089 <span class="comment">// function argument.</span>
2090 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">area</span><span class="special">></span> <span class="special">(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">>)</span> <span class="special">></span>
2091 <span class="identifier">A</span> <span class="special">=</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">area</span><span class="special">></span> <span class="special">(*)(</span><span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">length</span><span class="special">>&)>(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>),</span>
2092 <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">);</span>
2094 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Area of a square:"</span> <span class="special"><<</span> <span class="identifier">endl</span>
2095 <span class="special"><<</span> <span class="string">"A("</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span><span class="string">") = "</span> <span class="special"><<</span> <span class="identifier">A</span><span class="special">(</span><span class="identifier">l</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
2098 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2099 <span class="comment">// Thermal example: temperature difference of two absolute temperatures</span>
2100 <span class="comment">////////////////////////////////////////////////////////////////////////</span>
2102 <span class="comment">// Absolute temperature constants</span>
2103 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">></span>
2104 <span class="identifier">Tref</span> <span class="special">=</span> <span class="number">273.15</span> <span class="special">*</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">>();</span>
2105 <span class="keyword">const</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">></span>
2106 <span class="identifier">Tamb</span> <span class="special">=</span> <span class="number">300.00</span> <span class="special">*</span> <span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">>();</span>
2108 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">(</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">>,</span>
2109 <span class="identifier">bu</span><span class="special">::</span><span class="identifier">quantity</span><span class="special"><</span><span class="identifier">bu</span><span class="special">::</span><span class="identifier">absolute</span><span class="special"><</span><span class="identifier">si</span><span class="special">::</span><span class="identifier">temperature</span><span class="special">></span> <span class="special">>)></span>
2110 <span class="identifier">dT</span> <span class="special">=</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_2</span> <span class="special">-</span> <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">;</span>
2112 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Temperature difference of two absolute temperatures:"</span> <span class="special"><<</span> <span class="identifier">endl</span>
2113 <span class="special"><<</span> <span class="string">"dT("</span> <span class="special"><<</span> <span class="identifier">Tref</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">Tamb</span> <span class="special"><<</span> <span class="string">") = "</span> <span class="special"><<</span> <span class="identifier">dT</span><span class="special">(</span><span class="identifier">Tref</span><span class="special">,</span> <span class="identifier">Tamb</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span>
2114 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
2117 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
2118 <span class="special">}</span>
2124 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
2125 <td align="left"></td>
2126 <td align="right"><div class="copyright-footer">Copyright © 2003-2008 Matthias Christian Schabel<br>Copyright © 2007-2010 Steven
2128 Distributed under the Boost Software License, Version 1.0. (See accompanying
2129 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>)
2134 <div class="spirit-nav">
2135 <a accesskey="p" href="Quantities.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_units.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="Utilities.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>