![]() |
Home | Libraries | People | FAQ | More |
Before discussing the basics of the library, we first define a few terms that
will be used frequently in the following :
討論庫之前,我們先定義一些後面會經常用到的術語:
To begin, we present two short tutorials. Tutorial1
demonstrates the use of SI
units. After including the appropriate system headers and the headers for the
various SI units we will need (all SI units can be included with boost/units/systems/si.hpp) and
for quantity I/O (boost/units/io.hpp),
we define a function that computes the work, in joules, done by exerting a
force in newtons over a specified distance in meters and outputs the result
to std::cout. The quantity class accepts
a second template parameter as its value type; this parameter defaults to
double if not otherwise specified.
To demonstrate the ease of using user-defined types in dimensional calculations,
we also present code for computing the complex impedance using std::complex<double>
as the value type :
一上來,我們展示兩個很短的tutorials。Tutorial1
展示了對SI單位的使用。
包含了合適的系統和需要用的SI單位的頭文件(所有的SI單位包含在boost/units/systems/si.hpp)和量的I/O (boost/units/io.hpp),
我們定義了一個函數計算功(work),單位是焦耳(joules),通過施加力(work, newtons)作用一段距離(distance, meters)
並且將結果輸出到std::cout。quantity類第二個模板參數作為數值的類型;
這個參數默認是double。
為了展示在量綱計算中很容易使用用戶自定義類型,我們使用std::complex<double>作為計算複數電阻(complex impedance)的數值類型:
#include <complex> #include <iostream> #include <boost/typeof/std/complex.hpp> #include <boost/units/systems/si/energy.hpp> #include <boost/units/systems/si/force.hpp> #include <boost/units/systems/si/length.hpp> #include <boost/units/systems/si/electric_potential.hpp> #include <boost/units/systems/si/current.hpp> #include <boost/units/systems/si/resistance.hpp> #include <boost/units/systems/si/io.hpp> using namespace boost::units; using namespace boost::units::si; quantity<energy> work(const quantity<force>& F,const quantity<length>& dx) { return F*dx; } int main() { /// test calcuation of work quantity<force> F(2.0*newton); quantity<length> dx(2.0*meter); quantity<energy> E(work(F,dx)); std::cout << "F = " << F << std::endl << "dx = " << dx << std::endl << "E = " << E << std::endl << std::endl; /// check complex quantities typedef std::complex<double> complex_type; quantity<electric_potential,complex_type> v = complex_type(12.5,0.0)*volts; quantity<current,complex_type> i = complex_type(3.0,4.0)*amperes; quantity<resistance,complex_type> z = complex_type(1.5,-2.0)*ohms; std::cout << "V = " << v << std::endl << "I = " << i << std::endl << "Z = " << z << std::endl << "I*Z = " << i*z << std::endl << "I*Z == V? " << std::boolalpha << (i*z == v) << std::endl << std::endl; return 0; }
The intent and function of the above code should be obvious; the output produced
is :
上面代碼的功能和作用是很明顯的;輸出如下:
F = 2 N dx = 2 m E = 4 J V = (12.5,0) V I = (3,4) A Z = (1.5,-2) Ohm I*Z = (12.5,0) V I*Z == V? true
While this library attempts to make simple dimensional computations easy to
code, it is in no way tied to any particular unit system (SI or otherwise).
Instead, it provides a highly flexible compile-time system for dimensional
analysis, supporting arbitrary collections of base dimensions, rational powers
of units, and explicit quantity conversions. It accomplishes all of this via
template metaprogramming techniques. With modern optimizing compilers, this
results in zero runtime overhead for quantity computations relative to the
same code without unit checking.
雖然Boost.Units庫試圖使得量綱計算簡單,但並不會綁定到某個特定的單位系統(SI或其它)。
相反,它提供了一個高度可伸縮的量綱分析的編譯時系統,支持任意的基礎量綱,有理數次方
單位,顯式的量值轉換集合。它通過使用模板元編程(template metaprogramming techniques)
技術完成這一切。通過適當的優化, 和沒有單位檢查比較,不會帶來任何的運行時開銷。