Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Quick Start

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::coutquantity類第二個模板參數作為數值的類型; 這個參數默認是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) 技術完成這一切。通過適當的優化, 和沒有單位檢查比較,不會帶來任何的運行時開銷。


PrevUpHomeNext