1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>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"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="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> 25</div> 26<div class="section"> 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 54 Units</a></span></dt> 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> 58</dl></div> 59<div class="section"> 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> 63<p> 64 (<a href="../../../libs/units/example/dimension.cpp" target="_top">dimension.cpp</a>) 65 </p> 66<p> 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 : 72 </p> 73<p> 74</p> 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> 81</pre> 82<p> 83 </p> 84<p> 85 outputting (with symbol demangling, implemented in <a href="../../../boost/units/detail/utility.hpp" target="_top">utility.hpp</a>) 86 </p> 87<p> 88</p> 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> 96</pre> 97<p> 98 </p> 99</div> 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> 104<p> 105 (<a href="../../../libs/units/example/unit.cpp" target="_top">unit.cpp</a>) 106 </p> 107<p> 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> 110 </p> 111<p> 112</p> 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> 118</pre> 119<p> 120 </p> 121<p> 122 We can perform various algebraic operations on these units, resulting in 123 the following output: 124 </p> 125<p> 126</p> 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> 138</pre> 139<p> 140 </p> 141</div> 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> 146<p> 147 (<a href="../../../libs/units/example/quantity.cpp" target="_top">quantity.cpp</a>) 148 </p> 149<p> 150 This example demonstrates how to use quantities of our toy unit system : 151 </p> 152<p> 153</p> 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> 156</pre> 157<p> 158 </p> 159<p> 160 giving us the basic quantity functionality : 161 </p> 162<p> 163</p> 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> 176</pre> 177<p> 178 </p> 179<p> 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) : 183 </p> 184<p> 185</p> 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> 188</pre> 189<p> 190 </p> 191<p> 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 194 analysis : 195 </p> 196<p> 197</p> 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> 210</pre> 211<p> 212 </p> 213</div> 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> 221<p> 222 (<a href="../../../libs/units/example/kitchen_sink.cpp" target="_top">kitchen_sink.cpp</a>) 223 </p> 224<p> 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>. 228 </p> 229<p> 230 If we define a few units and associated quantities, 231 </p> 232<p> 233</p> 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> 236 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> 239 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> 243 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> 247</pre> 248<p> 249 </p> 250<p> 251 the various algebraic operations between scalars, units, and quantities give 252 </p> 253<p> 254</p> 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> 262</pre> 263<p> 264 </p> 265<p> 266 Scalar/unit operations : 267 </p> 268<p> 269</p> 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> 274</pre> 275<p> 276 </p> 277<p> 278 Unit/unit operations and integral/rational powers of units : 279 </p> 280<p> 281</p> 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> 292</pre> 293<p> 294 </p> 295<p> 296 Scalar/quantity operations : 297 </p> 298<p> 299</p> 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> 304</pre> 305<p> 306 </p> 307<p> 308 Unit/quantity operations : 309 </p> 310<p> 311</p> 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> 316</pre> 317<p> 318 </p> 319<p> 320 Quantity/quantity operations and integral/rational powers of quantities : 321 </p> 322<p> 323</p> 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> 336</pre> 337<p> 338 </p> 339<p> 340 Logical comparison operators are also defined between quantities : 341 </p> 342<p> 343</p> 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> 347</pre> 348<p> 349 </p> 350<p> 351 giving 352 </p> 353<p> 354</p> 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> 361</pre> 362<p> 363 </p> 364<p> 365 Implicit conversion is allowed between dimensionless quantities and their 366 corresponding value types : 367 </p> 368<p> 369</p> 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> 372</pre> 373<p> 374 </p> 375<p> 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 378 in the same system: 379 </p> 380<p> 381</p> 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="keyword">constexpr</span> 385<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> 386<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> 387 <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> 388<span class="special">{</span> 389 <span class="keyword">return</span> <span class="identifier">F</span><span class="special">*</span><span class="identifier">dx</span><span class="special">;</span> 390<span class="special">}</span> 391</pre> 392<p> 393 </p> 394<p> 395</p> 396<pre class="programlisting"><span class="comment">/// test calcuation of work</span> 397<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> 398<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> 399<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> 400</pre> 401<p> 402 </p> 403<p> 404 which functions as expected for SI quantities : 405 </p> 406<p> 407</p> 408<pre class="programlisting"><span class="identifier">F</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">N</span> 409<span class="identifier">dx</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">m</span> 410<span class="identifier">E</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">J</span> 411</pre> 412<p> 413 </p> 414<p> 415 The ideal gas law can also be implemented in SI units : 416 </p> 417<p> 418</p> 419<pre class="programlisting"><span class="comment">/// the ideal gas law in si units</span> 420<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> 421<span class="keyword">constexpr</span> 422<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> 423<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> 424 <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> 425 <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> 426<span class="special">{</span> 427 <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> 428 429 <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> 430 <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> 431<span class="special">}</span> 432</pre> 433<p> 434 </p> 435<p> 436</p> 437<pre class="programlisting"><span class="comment">/// test ideal gas law</span> 438<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> 439<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> 440<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> 441<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> 442<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> 443</pre> 444<p> 445 </p> 446<p> 447 with the resulting output : 448 </p> 449<p> 450</p> 451<pre class="programlisting"><span class="identifier">r</span> <span class="special">=</span> <span class="number">5e-07</span> <span class="identifier">m</span> 452<span class="identifier">P</span> <span class="special">=</span> <span class="number">101325</span> <span class="identifier">Pa</span> 453<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> 454<span class="identifier">T</span> <span class="special">=</span> <span class="number">310</span> <span class="identifier">K</span> 455<span class="identifier">n</span> <span class="special">=</span> <span class="number">2.05835e-17</span> <span class="identifier">mol</span> 456<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> 457</pre> 458<p> 459 </p> 460<p> 461 Trigonometric and inverse trigonometric functions can be implemented for 462 any unit system that provides an angular base dimension. For radians, these 463 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> 464 These behave as one expects, with trigonometric functions taking an angular 465 quantity and returning a dimensionless quantity, while the inverse trigonometric 466 functions take a dimensionless quantity and return an angular quantity : 467 </p> 468<p> 469 Defining a few angular quantities, 470 </p> 471<p> 472</p> 473<pre class="programlisting"><span class="comment">/// test trig stuff</span> 474<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> 475<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> 476<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> 477</pre> 478<p> 479 </p> 480<p> 481 yields 482 </p> 483<p> 484</p> 485<pre class="programlisting"><span class="identifier">theta</span> <span class="special">=</span> <span class="number">0.375</span> <span class="identifier">rd</span> 486<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> 487<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> 488</pre> 489<p> 490 </p> 491<p> 492 Dealing with complex quantities is trivial. Here is the calculation of complex 493 impedance : 494 </p> 495<p> 496</p> 497<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> 498<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> 499<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> 500</pre> 501<p> 502 </p> 503<p> 504 giving 505 </p> 506<p> 507</p> 508<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> 509<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> 510<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> 511<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> 512</pre> 513<p> 514 </p> 515<div class="section"> 516<div class="titlepage"><div><div><h4 class="title"> 517<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 518 value types</a> 519</h4></div></div></div> 520<p> 521 User-defined value types that support the appropriate arithmetic operations 522 are automatically supported as quantity value types. The operators that 523 are supported by default for quantity value types are unary plus, unary 524 minus, addition, subtraction, multiplication, division, equal-to, not-equal-to, 525 less-than, less-or-equal-to, greater-than, and greater-or-equal-to. Support 526 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> 527 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> 528 classes. Here we implement a user-defined <code class="computeroutput"><span class="identifier">measurement</span></code> 529 class that models a numerical measurement with an associated measurement 530 error and the appropriate algebra and demonstrates its use as a quantity 531 value type; the full code is found in <a href="../../../libs/units/example/measurement.hpp" target="_top">measurement.hpp</a>. 532 </p> 533<p> 534 Then, defining some <code class="computeroutput"><span class="identifier">measurement</span></code> 535 <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span> 536 variables 537 </p> 538<p> 539</p> 540<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> 541 <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> 542 <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> 543 <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> 544 <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> 545</pre> 546<p> 547 </p> 548<p> 549 gives 550 </p> 551<p> 552</p> 553<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> 554<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> 555<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> 556</pre> 557<p> 558 </p> 559<p> 560 If we implement the overloaded helper classes for rational powers and roots 561 then we can also compute rational powers of measurement quantities : 562 </p> 563<p> 564</p> 565<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> 566<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> 567</pre> 568<p> 569 </p> 570</div> 571</div> 572<div class="section"> 573<div class="titlepage"><div><div><h3 class="title"> 574<a name="boost_units.Examples.ConversionExample"></a><a class="link" href="Examples.html#boost_units.Examples.ConversionExample" title="Conversion Example">Conversion Example</a> 575</h3></div></div></div> 576<p> 577 (<a href="../../../libs/units/example/conversion.cpp" target="_top">conversion.cpp</a>) 578 </p> 579<p> 580 This example demonstrates the various allowed conversions between SI and 581 CGS units. Defining some quantities 582 </p> 583<p> 584</p> 585<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> 586<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> 587</pre> 588<p> 589 </p> 590<p> 591 illustrates implicit conversion of quantities of different value types where 592 implicit conversion of the value types themselves is allowed. N.B. The conversion 593 from double to int is treated as an explicit conversion because there is 594 no way to emulate the exact behavior of the built-in conversion. Explicit 595 constructors allow conversions for two cases: 596 </p> 597<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 598 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> 599 to a different <code class="computeroutput"><span class="identifier">value_type</span></code> 600 : 601 </li></ul></div> 602<p> 603</p> 604<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> 605</pre> 606<p> 607 </p> 608<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 609 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> 610 to a different unit : 611 </li></ul></div> 612<p> 613</p> 614<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> 615</pre> 616<p> 617 </p> 618<p> 619 giving the following output : 620 </p> 621<p> 622</p> 623<pre class="programlisting"><span class="identifier">L1</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span> 624<span class="identifier">L2</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span> 625<span class="identifier">L3</span> <span class="special">=</span> <span class="number">2</span> <span class="identifier">m</span> 626<span class="identifier">L4</span> <span class="special">=</span> <span class="number">200</span> <span class="identifier">cm</span> 627<span class="identifier">L5</span> <span class="special">=</span> <span class="number">5</span> <span class="identifier">m</span> 628<span class="identifier">L6</span> <span class="special">=</span> <span class="number">4</span> <span class="identifier">m</span> 629<span class="identifier">L7</span> <span class="special">=</span> <span class="number">200</span> <span class="identifier">cm</span> 630</pre> 631<p> 632 </p> 633<p> 634 A few more explicit unit system conversions : 635 </p> 636<p> 637</p> 638<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> 639<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> 640<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> 641 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">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> 643<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> 644<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> 645 646<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> 647 <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> 648</pre> 649<p> 650 </p> 651<p> 652 which produces the following output: 653 </p> 654<p> 655</p> 656<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> 657<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> 658<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> 659 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> 661<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> 662<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> 663 664<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> 665<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> 666</pre> 667<p> 668 </p> 669</div> 670<div class="section"> 671<div class="titlepage"><div><div><h3 class="title"> 672<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> 673</h3></div></div></div> 674<p> 675 (<a href="../../../libs/units/example/quaternion.cpp" target="_top">quaternion.cpp</a>) 676 </p> 677<p> 678 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> 679 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> 680 and the converse. For the first case, we first define specializations of 681 <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> 682 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> 683 for powers and roots, respectively: 684 </p> 685<p> 686</p> 687<pre class="programlisting"><span class="comment">/// specialize power typeof helper</span> 688<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> 689<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> 690<span class="special">{</span> 691 <span class="comment">// boost::math::quaternion only supports integer powers</span> 692 <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> 693 694 <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> 695 <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> 696 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span> 697 698 <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> 699 <span class="special">{</span> 700 <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> 701 <span class="special">}</span> 702<span class="special">};</span> 703</pre> 704<p> 705 </p> 706<p> 707</p> 708<pre class="programlisting"><span class="comment">/// specialize root typeof helper</span> 709<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> 710<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> 711<span class="special">{</span> 712 <span class="comment">// boost::math::quaternion only supports integer powers</span> 713 <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> 714 715 <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> 716 <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> 717 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span> 718 719 <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> 720 <span class="special">{</span> 721 <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> 722 <span class="special">}</span> 723<span class="special">};</span> 724</pre> 725<p> 726 </p> 727<p> 728 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> 729 of a <code class="computeroutput"><span class="identifier">quaternion</span></code> : 730 </p> 731<p> 732</p> 733<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> 734 735<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> 736</pre> 737<p> 738 </p> 739<p> 740 so that all operations that are defined in the <code class="computeroutput"><span class="identifier">quaternion</span></code> 741 class behave correctly. If rational powers were defined for this class, it 742 would be possible to compute rational powers and roots with no additional 743 changes. 744 </p> 745<p> 746</p> 747<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> 748<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> 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">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> 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">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> 751<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> 752<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> 753<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> 754</pre> 755<p> 756 </p> 757<p> 758 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 759 type of the <code class="computeroutput"><span class="identifier">quaternion</span></code> class 760 we would have : 761 </p> 762<p> 763</p> 764<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> 765 766<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> 767</pre> 768<p> 769 </p> 770<p> 771 Here, the unary plus and minus and addition and subtraction operators function 772 correctly. Unfortunately, the multiplication and division operations fail 773 because <code class="computeroutput"><span class="identifier">quaternion</span></code> implements 774 them in terms of the <code class="computeroutput"><span class="special">*=</span></code> and 775 <code class="computeroutput"><span class="special">/=</span></code> operators, respectively, 776 which are incapable of representing the heterogeneous unit algebra needed 777 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>, 778 for the same reason). In order to compute rational powers and roots, we need 779 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> 780 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> 781 as follows: 782 </p> 783<p> 784</p> 785<pre class="programlisting"><span class="comment">/// specialize power typeof helper for quaternion<quantity<Unit,Y> ></span> 786<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> 787<span class="keyword">struct</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span> 788 <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> 789 <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> 790<span class="special">{</span> 791 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span> 792 <span class="identifier">Y</span><span class="special">,</span> 793 <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> 794 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span> 795 796 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">power_typeof_helper</span><span class="special"><</span> 797 <span class="identifier">Unit</span><span class="special">,</span> 798 <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> 799 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span> 800 801 <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> 802 <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> 803 804 <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> 805 <span class="special">{</span> 806 <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> 807 <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> 808 <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> 809 <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> 810 <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> 811 <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> 812 813 <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> 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_2</span><span class="special">()),</span> 815 <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> 816 <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> 817 <span class="special">}</span> 818<span class="special">};</span> 819</pre> 820<p> 821 </p> 822<p> 823</p> 824<pre class="programlisting"><span class="comment">/// specialize root typeof helper for quaternion<quantity<Unit,Y> ></span> 825<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> 826<span class="keyword">struct</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span> 827 <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> 828 <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> 829<span class="special">{</span> 830 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span> 831 <span class="identifier">Y</span><span class="special">,</span> 832 <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> 833 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">value_type</span><span class="special">;</span> 834 835 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">root_typeof_helper</span><span class="special"><</span> 836 <span class="identifier">Unit</span><span class="special">,</span> 837 <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> 838 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">unit_type</span><span class="special">;</span> 839 840 <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> 841 <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> 842 843 <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> 844 <span class="special">{</span> 845 <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> 846 <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> 847 <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> 848 <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> 849 <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> 850 <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> 851 852 <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> 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_2</span><span class="special">()),</span> 854 <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> 855 <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> 856 <span class="special">}</span> 857<span class="special">};</span> 858</pre> 859<p> 860 </p> 861<p> 862 giving: 863 </p> 864<p> 865</p> 866<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> 867<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> 868<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> 869<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> 870<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> 871</pre> 872<p> 873 </p> 874</div> 875<div class="section"> 876<div class="titlepage"><div><div><h3 class="title"> 877<a name="boost_units.Examples.ComplexExample"></a><a class="link" href="Examples.html#boost_units.Examples.ComplexExample" title="Complex Example">Complex Example</a> 878</h3></div></div></div> 879<p> 880 (<a href="../../../libs/units/example/complex.cpp" target="_top">complex.cpp</a>) 881 </p> 882<p> 883 This example demonstrates how to implement a replacement <code class="computeroutput"><span class="identifier">complex</span></code> 884 class that functions correctly both as a quantity value type and as a quantity 885 container class, including heterogeneous multiplication and division operations 886 and rational powers and roots. Naturally, heterogeneous operations are only 887 supported on compilers that implement <code class="computeroutput"><span class="identifier">typeof</span></code>. 888 The primary differences are that binary operations are not implemented using 889 the <code class="computeroutput"><span class="identifier">op</span><span class="special">=</span></code> 890 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>, 891 <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>, 892 <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>, 893 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>. 894 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> 895 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> 896 are defined for both cases : 897 </p> 898<p> 899</p> 900<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 901 902<span class="keyword">namespace</span> <span class="identifier">units</span> <span class="special">{</span> 903 904<span class="comment">/// replacement complex class </span> 905<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 906<span class="keyword">class</span> <span class="identifier">complex</span> 907<span class="special">{</span> 908 <span class="keyword">public</span><span class="special">:</span> 909 <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> 910 911 <span class="keyword">constexpr</span> <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> 912 <span class="keyword">constexpr</span> <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> 913 914 <span class="keyword">constexpr</span> <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> 915 <span class="special">{</span> 916 <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> 917 918 <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> 919 <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> 920 921 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 922 <span class="special">}</span> 923 924 <span class="keyword">constexpr</span> <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> 925 <span class="keyword">constexpr</span> <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> 926 927 <span class="keyword">constexpr</span> <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> 928 <span class="keyword">constexpr</span> <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> 929 930 <span class="keyword">constexpr</span> <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> 931 <span class="special">{</span> 932 <span class="identifier">r_</span> <span class="special">+=</span> <span class="identifier">val</span><span class="special">;</span> 933 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 934 <span class="special">}</span> 935 936 <span class="keyword">constexpr</span> <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> 937 <span class="special">{</span> 938 <span class="identifier">r_</span> <span class="special">-=</span> <span class="identifier">val</span><span class="special">;</span> 939 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 940 <span class="special">}</span> 941 942 <span class="keyword">constexpr</span> <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> 943 <span class="special">{</span> 944 <span class="identifier">r_</span> <span class="special">*=</span> <span class="identifier">val</span><span class="special">;</span> 945 <span class="identifier">i_</span> <span class="special">*=</span> <span class="identifier">val</span><span class="special">;</span> 946 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 947 <span class="special">}</span> 948 949 <span class="keyword">constexpr</span> <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> 950 <span class="special">{</span> 951 <span class="identifier">r_</span> <span class="special">/=</span> <span class="identifier">val</span><span class="special">;</span> 952 <span class="identifier">i_</span> <span class="special">/=</span> <span class="identifier">val</span><span class="special">;</span> 953 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 954 <span class="special">}</span> 955 956 <span class="keyword">constexpr</span> <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> 957 <span class="special">{</span> 958 <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> 959 <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> 960 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 961 <span class="special">}</span> 962 963 <span class="keyword">constexpr</span> <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> 964 <span class="special">{</span> 965 <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> 966 <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> 967 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 968 <span class="special">}</span> 969 970 <span class="keyword">constexpr</span> <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> 971 <span class="special">{</span> 972 <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> 973 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 974 <span class="special">}</span> 975 976 <span class="keyword">constexpr</span> <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> 977 <span class="special">{</span> 978 <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> 979 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 980 <span class="special">}</span> 981 982 <span class="keyword">private</span><span class="special">:</span> 983 <span class="identifier">T</span> <span class="identifier">r_</span><span class="special">,</span><span class="identifier">i_</span><span class="special">;</span> 984<span class="special">};</span> 985 986<span class="special">}</span> 987 988<span class="special">}</span> 989 990<span class="preprocessor">#if</span> <span class="identifier">BOOST_UNITS_HAS_BOOST_TYPEOF</span> 991 992<span class="preprocessor">#include</span> <span class="identifier">BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP</span><span class="special">()</span> 993 994<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> 995 996<span class="preprocessor">#endif</span> 997 998<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 999 1000<span class="keyword">namespace</span> <span class="identifier">units</span> <span class="special">{</span> 1001 1002<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">></span> 1003<span class="keyword">constexpr</span> 1004<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> 1005<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> 1006<span class="special">{</span> 1007 <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> 1008 1009 <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> 1010<span class="special">}</span> 1011 1012<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">></span> 1013<span class="keyword">constexpr</span> 1014<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> 1015<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> 1016<span class="special">{</span> 1017 <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> 1018 1019 <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> 1020<span class="special">}</span> 1021 1022<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> 1023<span class="keyword">constexpr</span> 1024<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> 1025<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> 1026<span class="special">{</span> 1027 <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> 1028 1029 <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> 1030<span class="special">}</span> 1031 1032<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> 1033<span class="keyword">constexpr</span> 1034<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> 1035<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> 1036<span class="special">{</span> 1037 <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> 1038 1039 <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> 1040<span class="special">}</span> 1041 1042<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> 1043<span class="keyword">constexpr</span> 1044<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> 1045<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> 1046<span class="special">{</span> 1047 <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> 1048 1049 <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> 1050 <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> 1051 1052<span class="comment">// fully correct implementation has more complex return type</span> 1053<span class="comment">//</span> 1054<span class="comment">// typedef typename boost::units::multiply_typeof_helper<X,Y>::type xy_type;</span> 1055<span class="comment">// </span> 1056<span class="comment">// typedef typename boost::units::add_typeof_helper<</span> 1057<span class="comment">// xy_type,xy_type>::type xy_plus_xy_type;</span> 1058<span class="comment">// typedef typename</span> 1059<span class="comment">// boost::units::subtract_typeof_helper<xy_type,xy_type>::type</span> 1060<span class="comment">// xy_minus_xy_type;</span> 1061<span class="comment">// </span> 1062<span class="comment">// BOOST_STATIC_ASSERT((boost::is_same<xy_plus_xy_type,</span> 1063<span class="comment">// xy_minus_xy_type>::value == true));</span> 1064<span class="comment">// </span> 1065<span class="comment">// return complex<xy_plus_xy_type>(x.real()*y.real()-x.imag()*y.imag(),</span> 1066<span class="comment">// x.real()*y.imag()+x.imag()*y.real());</span> 1067<span class="special">}</span> 1068 1069<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> 1070<span class="keyword">constexpr</span> 1071<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> 1072<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> 1073<span class="special">{</span> 1074 <span class="comment">// naive implementation of complex division</span> 1075 <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> 1076 1077 <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> 1078 <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> 1079 <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> 1080 <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> 1081 1082<span class="comment">// fully correct implementation has more complex return type</span> 1083<span class="comment">//</span> 1084<span class="comment">// typedef typename boost::units::multiply_typeof_helper<X,Y>::type xy_type;</span> 1085<span class="comment">// typedef typename boost::units::multiply_typeof_helper<Y,Y>::type yy_type;</span> 1086<span class="comment">//</span> 1087<span class="comment">// typedef typename boost::units::add_typeof_helper<xy_type, xy_type>::type</span> 1088<span class="comment">// xy_plus_xy_type;</span> 1089<span class="comment">// typedef typename boost::units::subtract_typeof_helper<</span> 1090<span class="comment">// xy_type,xy_type>::type xy_minus_xy_type;</span> 1091<span class="comment">//</span> 1092<span class="comment">// typedef typename boost::units::divide_typeof_helper<</span> 1093<span class="comment">// xy_plus_xy_type,yy_type>::type xy_plus_xy_over_yy_type;</span> 1094<span class="comment">// typedef typename boost::units::divide_typeof_helper<</span> 1095<span class="comment">// xy_minus_xy_type,yy_type>::type xy_minus_xy_over_yy_type;</span> 1096<span class="comment">//</span> 1097<span class="comment">// BOOST_STATIC_ASSERT((boost::is_same<xy_plus_xy_over_yy_type,</span> 1098<span class="comment">// xy_minus_xy_over_yy_type>::value == true));</span> 1099<span class="comment">//</span> 1100<span class="comment">// return complex<xy_plus_xy_over_yy_type>(</span> 1101<span class="comment">// (x.real()*y.real()+x.imag()*y.imag())/</span> 1102<span class="comment">// (y.real()*y.real()+y.imag()*y.imag()),</span> 1103<span class="comment">// (x.imag()*y.real()-x.real()*y.imag())/</span> 1104<span class="comment">// (y.real()*y.real()+y.imag()*y.imag()));</span> 1105<span class="special">}</span> 1106 1107<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> 1108<span class="identifier">complex</span><span class="special"><</span><span class="identifier">Y</span><span class="special">></span> 1109<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> 1110<span class="special">{</span> 1111 <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> 1112 1113 <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> 1114 1115 <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> 1116<span class="special">}</span> 1117 1118<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">></span> 1119<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> 1120<span class="special">{</span> 1121 <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> 1122 1123 <span class="keyword">return</span> <span class="identifier">os</span><span class="special">;</span> 1124<span class="special">}</span> 1125 1126<span class="comment">/// specialize power typeof helper for complex<Y></span> 1127<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> 1128<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> 1129<span class="special">{</span> 1130 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span> 1131 <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> 1132 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span> 1133 1134 <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> 1135 <span class="special">{</span> 1136 <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> 1137 1138 <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> 1139 1140 <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> 1141 <span class="special">}</span> 1142<span class="special">};</span> 1143 1144<span class="comment">/// specialize root typeof helper for complex<Y></span> 1145<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> 1146<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> 1147<span class="special">{</span> 1148 <span class="keyword">typedef</span> <span class="identifier">complex</span><span class="special"><</span> 1149 <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> 1150 <span class="special">></span> <span class="identifier">type</span><span class="special">;</span> 1151 1152 <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> 1153 <span class="special">{</span> 1154 <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> 1155 1156 <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> 1157 1158 <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> 1159 <span class="special">}</span> 1160<span class="special">};</span> 1161 1162<span class="comment">/// specialize power typeof helper for complex<quantity<Unit,Y> ></span> 1163<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> 1164<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> 1165<span class="special">{</span> 1166 <span class="keyword">typedef</span> <span class="keyword">typename</span> 1167 <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> 1168 <span class="keyword">typedef</span> <span class="keyword">typename</span> 1169 <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> 1170 <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> 1171 <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> 1172 1173 <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> 1174 <span class="special">{</span> 1175 <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> 1176 <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> 1177 <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> 1178 1179 <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> 1180 <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> 1181 <span class="special">}</span> 1182<span class="special">};</span> 1183 1184<span class="comment">/// specialize root typeof helper for complex<quantity<Unit,Y> ></span> 1185<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> 1186<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> 1187<span class="special">{</span> 1188 <span class="keyword">typedef</span> <span class="keyword">typename</span> 1189 <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> 1190 <span class="keyword">typedef</span> <span class="keyword">typename</span> 1191 <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> 1192 <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> 1193 <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> 1194 1195 <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> 1196 <span class="special">{</span> 1197 <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> 1198 <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> 1199 <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> 1200 1201 <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> 1202 <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> 1203 <span class="special">}</span> 1204<span class="special">};</span> 1205 1206<span class="special">}</span> <span class="comment">// namespace units</span> 1207 1208<span class="special">}</span> <span class="comment">// namespace boost</span> 1209</pre> 1210<p> 1211 </p> 1212<p> 1213 With this replacement <code class="computeroutput"><span class="identifier">complex</span></code> 1214 class, we can declare a complex variable : 1215 </p> 1216<p> 1217</p> 1218<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> 1219 1220<span class="keyword">const</span> <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> 1221</pre> 1222<p> 1223 </p> 1224<p> 1225 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 : 1226 </p> 1227<p> 1228</p> 1229<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> 1230<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> 1231<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> 1232<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> 1233<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> 1234<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> 1235<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> 1236<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> 1237<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> 1238<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> 1239</pre> 1240<p> 1241 </p> 1242<p> 1243 and, similarly, <code class="computeroutput"><span class="identifier">complex</span></code> with 1244 a <span class="underline"><code class="computeroutput"><a class="link" href="../boost/units/quantity.html" title="Class template quantity">quantity</a></code></span> 1245 value type 1246 </p> 1247<p> 1248</p> 1249<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> 1250 1251<span class="keyword">const</span> <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> 1253<p> 1254 </p> 1255<p> 1256 gives 1257 </p> 1258<p> 1259</p> 1260<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> 1261<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> 1262<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> 1263<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> 1264<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> 1265<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> 1266<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> 1267<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> 1268<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> 1269<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> 1270</pre> 1271<p> 1272 </p> 1273</div> 1274<div class="section"> 1275<div class="titlepage"><div><div><h3 class="title"> 1276<a name="boost_units.Examples.PerformanceExample"></a><a class="link" href="Examples.html#boost_units.Examples.PerformanceExample" title="Performance Example">Performance 1277 Example</a> 1278</h3></div></div></div> 1279<p> 1280 (<a href="../../../libs/units/example/performance.cpp" target="_top">performance.cpp</a>) 1281 </p> 1282<p> 1283 This example provides an ad hoc performance test to verify that zero runtime 1284 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> 1285 in place of <code class="computeroutput"><span class="keyword">double</span></code>. Note that 1286 performance optimization and testing is not trivial, so some care must be 1287 taken in profiling. It is also critical to have a compiler capable of optimizing 1288 the many template instantiations and inline calls effectively to achieve 1289 maximal performance. Zero overhead for this test has been verified using 1290 gcc 4.0.1, and icc 9.0, 10.0, and 10.1 on Mac OS 10.4 and 10.5, and using 1291 msvc 8.0 on Windows XP. 1292 </p> 1293</div> 1294<div class="section"> 1295<div class="titlepage"><div><div><h3 class="title"> 1296<a name="boost_units.Examples.RadarBeamHeightExample"></a><a class="link" href="Examples.html#boost_units.Examples.RadarBeamHeightExample" title="Radar Beam Height">Radar Beam 1297 Height</a> 1298</h3></div></div></div> 1299<p> 1300 (<a href="../../../libs/units/example/radar_beam_height.cpp" target="_top">radar_beam_height.cpp</a>) 1301 </p> 1302<p> 1303 This example demonstrates the implementation of two non-SI units of length, 1304 the nautical mile : 1305 </p> 1306<p> 1307</p> 1308<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">nautical</span> <span class="special">{</span> 1309 1310<span class="keyword">struct</span> <span class="identifier">length_base_unit</span> <span class="special">:</span> 1311 <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> 1312<span class="special">{</span> 1313 <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> 1314 <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> 1315<span class="special">};</span> 1316 1317<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> 1318 1319<span class="comment">/// unit typedefs</span> 1320<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> 1321 1322<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> 1323 1324<span class="special">}</span> <span class="comment">// namespace nautical</span> 1325 1326<span class="comment">// helper for conversions between nautical length and si length</span> 1327<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> 1328 <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> 1329 <span class="keyword">double</span><span class="special">,</span> <span class="number">1.852e3</span><span class="special">);</span> 1330</pre> 1331<p> 1332 </p> 1333<p> 1334 and the imperial foot : 1335 </p> 1336<p> 1337</p> 1338<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">imperial</span> <span class="special">{</span> 1339 1340<span class="keyword">struct</span> <span class="identifier">length_base_unit</span> <span class="special">:</span> 1341 <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> 1342<span class="special">{</span> 1343 <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> 1344 <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> 1345<span class="special">};</span> 1346 1347<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> 1348 1349<span class="comment">/// unit typedefs</span> 1350<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> 1351 1352<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> 1353 1354<span class="special">}</span> <span class="comment">// imperial</span> 1355 1356<span class="comment">// helper for conversions between imperial length and si length</span> 1357<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> 1358 <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> 1359 <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> 1360</pre> 1361<p> 1362 </p> 1363<p> 1364 These units include conversions between themselves and the meter. Three functions 1365 for computing radar beam height from radar range and the local earth radius 1366 are defined. The first takes arguments in one system and returns a value 1367 in the same system : 1368 </p> 1369<p> 1370</p> 1371<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> 1372<span class="keyword">constexpr</span> 1373<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> 1374<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> 1375 <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> 1376 <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> 1377<span class="special">{</span> 1378 <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> 1379 <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> 1380<span class="special">}</span> 1381</pre> 1382<p> 1383 </p> 1384<p> 1385 The second is similar, but is templated on return type, so that the arguments 1386 are converted to the return unit system internally : 1387 </p> 1388<p> 1389</p> 1390<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> 1391<span class="keyword">constexpr</span> 1392<span class="identifier">return_type</span> 1393<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> 1394 <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> 1395 <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> 1396<span class="special">{</span> 1397 <span class="comment">// need to decide which system to use for calculation</span> 1398 <span class="keyword">return</span> <span class="identifier">pow</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">return_type</span><span class="special">>(</span><span class="identifier">radar_range</span><span class="special">))</span> 1399 <span class="special">/</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="keyword">static_cast</span><span class="special"><</span><span class="identifier">return_type</span><span class="special">>(</span><span class="identifier">earth_radius</span><span class="special">));</span> 1400<span class="special">}</span> 1401</pre> 1402<p> 1403 </p> 1404<p> 1405 Finally, the third function is an empirical approximation that is only valid 1406 for radar ranges specified in nautical miles, returning beam height in feet. 1407 This function uses the heterogeneous unit of nautical miles per square root 1408 of feet to ensure dimensional correctness : 1409 </p> 1410<p> 1411</p> 1412<pre class="programlisting"><span class="keyword">constexpr</span> 1413<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> 1414<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> 1415<span class="special">{</span> 1416 <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> 1417 <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> 1418<span class="special">}</span> 1419</pre> 1420<p> 1421 </p> 1422<p> 1423 With these, we can compute radar beam height in various unit systems : 1424 </p> 1425<p> 1426</p> 1427<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> 1428<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> 1429 1430<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> 1431<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> 1432<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> 1433<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> 1434</pre> 1435<p> 1436 </p> 1437<p> 1438 giving 1439 </p> 1440<p> 1441</p> 1442<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> 1443<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> 1444<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> 1445<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> 1446<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> 1447<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> 1448<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> 1449<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> 1450</pre> 1451<p> 1452 </p> 1453</div> 1454<div class="section"> 1455<div class="titlepage"><div><div><h3 class="title"> 1456<a name="boost_units.Examples.HeterogeneousUnitExample"></a><a class="link" href="Examples.html#boost_units.Examples.HeterogeneousUnitExample" title="Heterogeneous Unit Example">Heterogeneous 1457 Unit Example</a> 1458</h3></div></div></div> 1459<p> 1460 (<a href="../../../libs/units/example/heterogeneous_unit.cpp" target="_top">heterogeneous_unit.cpp</a>) 1461 </p> 1462<p> 1463 Mixed units and mixed unit conversions. 1464 </p> 1465<p> 1466 This code: 1467 </p> 1468<p> 1469</p> 1470<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> 1471<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> 1472 1473<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> 1474 <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> 1475 <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> 1476 <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> 1477 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 1478 1479<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> 1480 <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> 1481 <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> 1482 1483<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> 1484 <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> 1485 <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> 1486</pre> 1487<p> 1488 </p> 1489<p> 1490 gives 1491 </p> 1492<p> 1493</p> 1494<pre class="programlisting"><span class="number">1.5</span> <span class="identifier">m</span> 1495<span class="number">1</span> <span class="identifier">g</span> 1496<span class="number">1.5</span> <span class="identifier">m</span> <span class="identifier">g</span> 1497<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> 1498 1499<span class="number">1</span> <span class="identifier">N</span> 1500<span class="number">1</span> <span class="identifier">kg</span> <span class="identifier">s</span><span class="special">^-</span><span class="number">2</span> 1501 1502<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> 1503<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> 1504</pre> 1505<p> 1506 </p> 1507<p> 1508 Arbitrary conversions also work: 1509 </p> 1510<p> 1511</p> 1512<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> 1513 1514<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> 1515 <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> 1516 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 1517</pre> 1518<p> 1519 </p> 1520<p> 1521 yielding 1522 </p> 1523<p> 1524</p> 1525<pre class="programlisting"><span class="number">1.5</span> <span class="identifier">cm</span> <span class="identifier">m</span> 1526<span class="number">0.015</span> <span class="identifier">m</span><span class="special">^</span><span class="number">2</span> 1527</pre> 1528<p> 1529 </p> 1530</div> 1531<div class="section"> 1532<div class="titlepage"><div><div><h3 class="title"> 1533<a name="boost_units.Examples.AbsoluteRelativeTemperatureExample"></a><a class="link" href="Examples.html#boost_units.Examples.AbsoluteRelativeTemperatureExample" title="Absolute and Relative Temperature Example">Absolute 1534 and Relative Temperature Example</a> 1535</h3></div></div></div> 1536<p> 1537 (<a href="../../../libs/units/example/temperature.cpp" target="_top">temperature.cpp</a>) 1538 </p> 1539<p> 1540 This example demonstrates using of absolute temperatures and relative temperature 1541 differences in Fahrenheit and converting between these and the Kelvin temperature 1542 scale. This issue touches on some surprisingly deep mathematical concepts 1543 (see <a href="http://en.wikipedia.org/wiki/Affine_space" target="_top">Wikipedia</a> 1544 for a basic review), but for our purposes here, we will simply observe that 1545 it is important to be able to differentiate between an absolute temperature 1546 measurement and a measurement of temperature difference. This is accomplished 1547 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> 1548 wrapper class. 1549 </p> 1550<p> 1551 First we define a system using the predefined fahrenheit base unit: 1552 </p> 1553<p> 1554</p> 1555<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> 1556<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> 1557 1558<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> 1559<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> 1560</pre> 1561<p> 1562 </p> 1563<p> 1564 Now we can create some quantities: 1565 </p> 1566<p> 1567</p> 1568<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> 1569 <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> 1570<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> 1571 <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> 1572 1573<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> 1574<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> 1575</pre> 1576<p> 1577 </p> 1578<p> 1579 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> 1580 to wrap a unit. The resulting output is: 1581 </p> 1582<p> 1583</p> 1584<pre class="programlisting"><span class="special">{</span> <span class="number">32</span> <span class="special">}</span> <span class="identifier">F</span> 1585<span class="special">{</span> <span class="number">273.15</span> <span class="special">}</span> <span class="identifier">K</span> 1586<span class="special">{</span> <span class="number">273.15</span> <span class="special">}</span> <span class="identifier">K</span> 1587<span class="special">[</span> <span class="number">32</span> <span class="special">]</span> <span class="identifier">F</span> 1588<span class="special">[</span> <span class="number">17.7778</span> <span class="special">]</span> <span class="identifier">K</span> 1589<span class="special">[</span> <span class="number">17.7778</span> <span class="special">]</span> <span class="identifier">K</span> 1590</pre> 1591<p> 1592 </p> 1593</div> 1594<div class="section"> 1595<div class="titlepage"><div><div><h3 class="title"> 1596<a name="boost_units.Examples.RuntimeConversionFactorExample"></a><a class="link" href="Examples.html#boost_units.Examples.RuntimeConversionFactorExample" title="Runtime Conversion Factor Example">Runtime 1597 Conversion Factor Example</a> 1598</h3></div></div></div> 1599<p> 1600 (<a href="../../../libs/units/example/runtime_conversion_factor.cpp" target="_top">runtime_conversion_factor.cpp</a>) 1601 </p> 1602<p> 1603 The Boost.Units library does not require that the conversion factors be compile 1604 time constants, as is demonstrated in this example: 1605 </p> 1606<p> 1607</p> 1608<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> 1609<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> 1610 1611<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> 1612 1613<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> 1614 1615<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> 1616 1617<span class="keyword">template</span><span class="special"><</span><span class="keyword">long</span> <span class="identifier">N</span><span class="special">></span> 1618<span class="keyword">struct</span> <span class="identifier">currency_base_unit</span> <span class="special">:</span> 1619 <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> 1620 1621<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> 1622<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> 1623 1624<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> 1625<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> 1626 1627<span class="comment">// an array of all possible conversions</span> 1628<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> 1629 <span class="special">{</span><span class="number">1.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">},</span> 1630 <span class="special">{</span><span class="number">1.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">}</span> 1631<span class="special">};</span> 1632 1633<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> 1634 <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> 1635<span class="special">}</span> 1636 1637<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> 1638 <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> 1639 <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> 1640<span class="special">}</span> 1641 1642<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> 1643 <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="identifier">N1</span><span class="special">>,</span> 1644 <span class="identifier">currency_base_unit</span><span class="special"><</span><span class="identifier">N2</span><span class="special">>,</span> 1645 <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> 1646</pre> 1647<p> 1648 </p> 1649</div> 1650<div class="section"> 1651<div class="titlepage"><div><div><h3 class="title"> 1652<a name="boost_units.Examples.UnitsWithNonbaseDimensions"></a><a class="link" href="Examples.html#boost_units.Examples.UnitsWithNonbaseDimensions" title="Units with Non-base Dimensions">Units 1653 with Non-base Dimensions</a> 1654</h3></div></div></div> 1655<p> 1656 (<a href="../../../libs/units/example/non_base_dimension.cpp" target="_top">non_base_dimension.cpp</a>) 1657 </p> 1658<p> 1659 It is also possible to define base units that have derived rather than base 1660 dimensions: 1661 </p> 1662<p> 1663</p> 1664<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">imperial_gallon_tag</span> <span class="special">:</span> 1665 <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> 1666 1667<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> 1668 1669<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> 1670 1671<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> 1672 1673<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> 1674 1675<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> 1676</pre> 1677<p> 1678 </p> 1679</div> 1680<div class="section"> 1681<div class="titlepage"><div><div><h3 class="title"> 1682<a name="boost_units.Examples.OutputForCompositeUnits"></a><a class="link" href="Examples.html#boost_units.Examples.OutputForCompositeUnits" title="Output for Composite Units">Output 1683 for Composite Units</a> 1684</h3></div></div></div> 1685<p> 1686 (<a href="../../../libs/units/example/composite_output.cpp" target="_top">composite_output.cpp</a>) 1687 </p> 1688<p> 1689 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> 1690 can be overloaded directly. 1691 </p> 1692<p> 1693</p> 1694<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> 1695<span class="special">{</span> 1696 <span class="keyword">return</span> <span class="string">"dyne"</span><span class="special">;</span> 1697<span class="special">}</span> 1698 1699<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> 1700<span class="special">{</span> 1701 <span class="keyword">return</span> <span class="string">"dyn"</span><span class="special">;</span> 1702<span class="special">}</span> 1703</pre> 1704<p> 1705 </p> 1706<p> 1707 In this case, any unit that reduces to the overloaded unit will be output 1708 with the replacement symbol. 1709 </p> 1710<p> 1711 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> 1712 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>, 1713 respectively. If these headers are not included, the output will simply follow 1714 default rules using the appropriate fundamental dimensions. Note that neither 1715 of these functions is defined for quantities because doing so would require 1716 making assumptions on how the corresponding value type should be formatted. 1717 </p> 1718<p> 1719 Three <code class="computeroutput"><span class="identifier">ostream</span></code> formatters, 1720 <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> 1721 are provided for convenience. These select the textual representation of 1722 units provided by <code class="computeroutput"><span class="identifier">symbol_string</span></code> 1723 or <code class="computeroutput"><span class="identifier">name_string</span></code> in the first 1724 two cases, while the latter returns a demangled typename for debugging purposes. 1725 Formatting of scaled unit is also done correctly. 1726 </p> 1727</div> 1728<div class="section"> 1729<div class="titlepage"><div><div><h3 class="title"> 1730<a name="boost_units.Examples.autoscale"></a><a class="link" href="Examples.html#boost_units.Examples.autoscale" title="Automatically Scaled Units">Automatically Scaled 1731 Units</a> 1732</h3></div></div></div> 1733<p> 1734 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> 1735 automatically, depending on its value, to keep the integral part in a limited 1736 range, usually between 1 and 999. 1737 </p> 1738<p> 1739 For example, using <a href="http://en.wikipedia.org/wiki/Engineering_notation" target="_top">engineering 1740 notation prefixes</a>, 1741 </p> 1742<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> 1743<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> 1744</pre> 1745<p> 1746 The iostream manipulators <code class="computeroutput"><span class="identifier">engineering_prefixes</span></code> 1747 or <code class="computeroutput"><span class="identifier">binary_prefixes</span></code> make this 1748 easy. 1749 </p> 1750<p> 1751</p> 1752<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> 1753<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> 1754<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> 1755 1756<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> 1757<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> 1758<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> 1759<span class="comment">// Note that a double 1000.0 is required - an integer will fail to compile.</span> 1760<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> 1761 1762<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> 1763<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> 1764<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> 1765</pre> 1766<p> 1767 </p> 1768<p> 1769 (The complete set of <a href="http://physics.nist.gov/cuu/Units/prefixes.html" target="_top">engineering 1770 and scientific multiples</a> is not used (not centi or deci for example), 1771 but only powers of ten that are multiples of three, 10^3). 1772 </p> 1773<p> 1774 Similarly, the equivalent <a href="http://en.wikipedia.org/wiki/Binary_prefixes" target="_top">binary 1775 prefixes</a> used for displaying computing kilobytes, megabytes, gigabytes... 1776 </p> 1777<p> 1778 These are the 2^10 = 1024, 2^20 = 1 048 576, 2^30 ... multiples. 1779 </p> 1780<p> 1781 (See also <a href="http://physics.nist.gov/cuu/Units/binary.html" target="_top">Prefixes 1782 for binary multiples</a> 1783 </p> 1784<p> 1785 This scale is specified in IEC 60027-2, Second edition, 2000-11, Letter symbols 1786 to be used in electrical technology - Part 2: Telecommunications and electronics). 1787 </p> 1788<p> 1789</p> 1790<pre class="programlisting"><span class="comment">// Don't forget that the units name or symbol format specification is persistent.</span> 1791<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> 1792 1793<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> 1794<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> 1795<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> 1796</pre> 1797<p> 1798 </p> 1799<p> 1800 But note that scalar dimensionless values, like int, float and double, are 1801 <span class="bold"><strong>not</strong></span> prefixed automatically by the engineering_prefix 1802 or binary_prefix iostream manipulators. 1803 </p> 1804<p> 1805</p> 1806<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> 1807<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> 1808<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> 1809<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> 1810 1811<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> 1812<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> 1813</pre> 1814<p> 1815 </p> 1816<p> 1817 You can output the name or symbol of a unit (rather than the most common 1818 quantity of a unit). 1819 </p> 1820<p> 1821</p> 1822<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> 1823<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> 1824<span class="comment">// but default is symbol format so output is just "m".</span> 1825<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> 1826</pre> 1827<p> 1828 </p> 1829<p> 1830 Note too that all the formatting flags are persistent, so that if you set 1831 engineering_prefix, then it applies to all future outputs, until you select 1832 binary_prefix, or explicitly switch autoprefix off. You can specify no prefix 1833 (the default of course) in two ways: 1834 </p> 1835<p> 1836</p> 1837<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> 1838<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> 1839</pre> 1840<p> 1841 </p> 1842<p> 1843 And you can get the format flags for diagnosing problems. 1844 </p> 1845<p> 1846</p> 1847<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> 1848<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> 1849</pre> 1850<p> 1851 </p> 1852</div> 1853<div class="section"> 1854<div class="titlepage"><div><div><h3 class="title"> 1855<a name="boost_units.Examples.ConversionFactor"></a><a class="link" href="Examples.html#boost_units.Examples.ConversionFactor" title="Conversion Factor">Conversion Factor</a> 1856</h3></div></div></div> 1857<p> 1858 This code demonstrates the use of the <code class="computeroutput"><span class="identifier">conversion_factor</span></code> 1859 free function to determine the scale factor between two units. 1860 </p> 1861<p> 1862 (<a href="../../../libs/units/example/conversion_factor.cpp" target="_top">conversion_factor.cpp</a>) 1863 </p> 1864<p> 1865</p> 1866<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">dyne_to_newton</span> <span class="special">=</span> 1867 <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> 1868<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> 1869 1870<span class="keyword">double</span> <span class="identifier">force_over_mass_conversion</span> <span class="special">=</span> 1871 <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> 1872<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> 1873 1874<span class="keyword">double</span> <span class="identifier">momentum_conversion</span> <span class="special">=</span> 1875 <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> 1876<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> 1877 1878<span class="keyword">double</span> <span class="identifier">momentum_over_mass_conversion</span> <span class="special">=</span> 1879 <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> 1880<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> 1881 1882<span class="keyword">double</span> <span class="identifier">acceleration_conversion</span> <span class="special">=</span> 1883 <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> 1884<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> 1885</pre> 1886<p> 1887 </p> 1888<p> 1889 Produces 1890 </p> 1891<p> 1892</p> 1893<pre class="programlisting"><span class="number">1e-005</span> 1894<span class="number">100</span> 1895<span class="number">1e-005</span> 1896<span class="number">100</span> 1897<span class="number">0.01</span> 1898</pre> 1899<p> 1900 </p> 1901</div> 1902<div class="section"> 1903<div class="titlepage"><div><div><h3 class="title"> 1904<a name="boost_units.Examples.RuntimeUnits"></a><a class="link" href="Examples.html#boost_units.Examples.RuntimeUnits" title="Runtime Units">Runtime Units</a> 1905</h3></div></div></div> 1906<p> 1907 (<a href="../../../libs/units/example/runtime_unit.cpp" target="_top">runtime_unit.cpp</a>) 1908 </p> 1909<p> 1910 This example shows how to implement an interface that allow different units 1911 at runtime while still maintaining type safety for internal calculations. 1912 </p> 1913<p> 1914</p> 1915<pre class="programlisting"><span class="keyword">namespace</span> <span class="special">{</span> 1916 1917<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> 1918<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> 1919 1920<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> 1921 1922<span class="special">}</span> 1923 1924<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> 1925<span class="special">{</span> 1926 <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> 1927<span class="special">}</span> 1928 1929<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 1930<span class="special">{</span> 1931 <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> 1932 <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> 1933 <span class="identifier">known_units</span><span class="special">[</span><span class="string">"foot"</span><span class="special">]</span> <span class="special">=</span> 1934 <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> 1935 1936 <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> 1937 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">;</span> 1938 1939 <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> 1940 <span class="special">{</span> 1941 <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> 1942 <span class="special">{</span> 1943 <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> 1944 <span class="special">}</span> 1945 <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> 1946 <span class="special">{</span> 1947 <span class="keyword">break</span><span class="special">;</span> 1948 <span class="special">}</span> 1949 <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> 1950 <span class="special">{</span> 1951 <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> 1952 <span class="string">"type \"return 'unit'\" to set the return units\n"</span> 1953 <span class="string">"type \"'number' 'unit'\" to do a simple calculation"</span> 1954 <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> <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> 1957 <span class="special">{</span> 1958 <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> 1959 <span class="special">{</span> 1960 <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> 1961 <span class="special">{</span> 1962 <span class="identifier">output_type</span> <span class="special">=</span> <span class="identifier">input</span><span class="special">;</span> 1963 <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> 1964 <span class="special">}</span> 1965 <span class="keyword">else</span> 1966 <span class="special">{</span> 1967 <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> 1968 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 1969 <span class="special">}</span> 1970 <span class="special">}</span> 1971 <span class="keyword">else</span> 1972 <span class="special">{</span> 1973 <span class="keyword">break</span><span class="special">;</span> 1974 <span class="special">}</span> 1975 <span class="special">}</span> 1976 <span class="keyword">else</span> 1977 <span class="special">{</span> 1978 <span class="keyword">try</span> 1979 <span class="special">{</span> 1980 <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> 1981 1982 <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> 1983 <span class="special">{</span> 1984 <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> 1985 <span class="special">{</span> 1986 <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> 1987 <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> 1988 <span class="identifier">known_units</span><span class="special">[</span><span class="identifier">output_type</span><span class="special">])</span> 1989 <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> 1990 <span class="special">}</span> 1991 <span class="keyword">else</span> 1992 <span class="special">{</span> 1993 <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> 1994 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 1995 <span class="special">}</span> 1996 <span class="special">}</span> 1997 <span class="keyword">else</span> 1998 <span class="special">{</span> 1999 <span class="keyword">break</span><span class="special">;</span> 2000 <span class="special">}</span> 2001 <span class="special">}</span> 2002 <span class="keyword">catch</span><span class="special">(...)</span> 2003 <span class="special">{</span> 2004 <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> 2005 <span class="special">}</span> 2006 <span class="special">}</span> 2007 <span class="special">}</span> 2008<span class="special">}</span> 2009</pre> 2010<p> 2011 </p> 2012</div> 2013<div class="section"> 2014<div class="titlepage"><div><div><h3 class="title"> 2015<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> 2016</h3></div></div></div> 2017<p> 2018 (<a href="../../../libs/units/example/lambda.cpp" target="_top">lambda.cpp</a>) 2019 </p> 2020<p> 2021 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> 2022 provides overloads and specializations needed to make Boost.Units usable 2023 with the Boost.Lambda library. 2024 </p> 2025<p> 2026</p> 2027<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> 2028 2029 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 2030 <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> 2031 <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> 2032 <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> 2033 2034 2035 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2036 <span class="comment">// Mechanical example: linear accelerated movement</span> 2037 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2038 2039 <span class="comment">// Initial condition variables for acceleration, speed, and displacement</span> 2040 <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> 2041 <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> 2042 <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> 2043 2044 <span class="comment">// Displacement over time</span> 2045 <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> 2046 <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> 2047 <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> 2048 <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> 2049 2050 <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> 2051 <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> 2054 2055 <span class="comment">// Change initial conditions</span> 2056 <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> 2057 <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> 2058 <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> 2059 2060 <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> 2061 <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> 2062 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 2063 2064 2065 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2066 <span class="comment">// Electrical example: oscillating current</span> 2067 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2068 2069 <span class="comment">// Constants for the current amplitude, frequency, and offset current</span> 2070 <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> 2071 <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> 2072 <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> 2073 2074 <span class="comment">// The invocation of the sin function needs to be postponed using</span> 2075 <span class="comment">// bind to specify the oscillation function. A lengthy static_cast</span> 2076 <span class="comment">// to the function pointer referencing boost::units::sin() is needed</span> 2077 <span class="comment">// to avoid an "unresolved overloaded function type" error.</span> 2078 <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> 2079 <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">iamp</span> 2080 <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> 2081 <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> 2082 <span class="special">+</span> <span class="identifier">i0</span><span class="special">;</span> 2083 2084 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Oscillating current:"</span> <span class="special"><<</span> <span class="identifier">endl</span> 2085 <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> 2086 <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> 2087 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 2088 2089 2090 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2091 <span class="comment">// Geometric example: area calculation for a square</span> 2092 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2093 2094 <span class="comment">// Length constant</span> 2095 <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> 2096 2097 <span class="comment">// Again an ugly static_cast is needed to bind pow<2> to the first</span> 2098 <span class="comment">// function argument.</span> 2099 <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> 2100 <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> 2101 <span class="identifier">bl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">);</span> 2102 2103 <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> 2104 <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> 2105 2106 2107 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2108 <span class="comment">// Thermal example: temperature difference of two absolute temperatures</span> 2109 <span class="comment">////////////////////////////////////////////////////////////////////////</span> 2110 2111 <span class="comment">// Absolute temperature constants</span> 2112 <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> 2113 <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> 2114 <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> 2115 <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> 2116 2117 <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> 2118 <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> 2119 <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> 2120 2121 <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> 2122 <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> 2123 <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 2124 2125 2126 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 2127<span class="special">}</span> 2128</pre> 2129<p> 2130 </p> 2131</div> 2132</div> 2133<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 2134<td align="left"></td> 2135<td align="right"><div class="copyright-footer">Copyright © 2003-2008 Matthias Christian Schabel<br>Copyright © 2007-2010 Steven 2136 Watanabe<p> 2137 Distributed under the Boost Software License, Version 1.0. (See accompanying 2138 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>) 2139 </p> 2140</div></td> 2141</tr></table> 2142<hr> 2143<div class="spirit-nav"> 2144<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> 2145</div> 2146</body> 2147</html> 2148