CLX C++ Libraries - unit
Author: clown

CLX C++ Libraries
Home >> unit

# Declarations

    template <int N, int D = 1>
    class unit;

    template <class Unit>
    Unit unit_cast(double x);

    typedef unit<1, 1000000000> nano;
    typedef unit<1,    1000000> micro;
    typedef unit<1,       1000> milli;
    typedef unit<1,        100> centi;
    typedef unit<1,         10> deci;
    typedef unit<        10, 1> deca;
    typedef unit<       100, 1> hecto;
    typedef unit<      1000, 1> kilo;
    typedef unit<   1000000, 1> mega;
    typedef unit<1000000000, 1> giga;

    typedef unit<8, 1> byte;

# Overview

unit は，単位を定義するためのクラスです．N/D という形で， その単位の基準となる値を保持します．unit クラスのインスタンスを参照すると， 基準となる値に変換した後の値を取得することができます．一方，value() メソッドは， その単位で変換された値を返します．例えば，byte クラスを下記のように使用した場合， filesize は 512 * 8，filesize.value() は 512 を返します．

    clx::byte filesize(512)

unit クラスは，ある単位で表された値を基準となる値に変換するためのクラスです． この逆変換（基準となる値からある単位で表された値への変換）を行う場合は，unit_cast を使用します．

# Example

example_unit.cpp

    #include <iostream>
    #include "clx/unit.h"

    int main(int argc, char* argv[]) {
        std::cout << clx::nano(1) << ", ";
        std::cout << clx::micro(1) << ", ";
        std::cout << clx::milli(1) << ", ";
        std::cout << clx::kilo(1) << ", ";
        std::cout << clx::mega(1) << ", ";
        std::cout << clx::giga(1) << std::endl;

        std::cout << "2M + 34k = " << clx::mega(2) + clx::kilo(34) << std::endl;

        // 時間単位の入力値の合計を秒単位で出力
        typedef clx::unit<3600> hour;
        hour sum;
        for (int i = 0; i < 10; i++) sum += i;
        std::cout << sum.value() << " hours -> " << sum << " seconds" << std::endl;

        // 分->時間単位への変換
        typedef clx::unit<60> minute;
        minute minutes(1440);
        hour test = clx::unit_cast<hour>(minutes);
        std::cout << minutes.value() << " minutes -> " << test.value() <<
            " hours" << std::endl;

        return 0;
    }

    Result
    1e-09, 1e-06, 0.001, 1000, 1e+06, 1e+09
    2M + 34k = 2.034e+06
    45 hours -> 162000 seconds
    1440 minutes -> 24 hours

# Template Parameters

N
  単位の基準値を分数で表したときの分子の値を指定します．
D
  単位の基準値を分数で表したときの分母の値を指定します．デフォルト値は，1．

# Related Types

    typedef unsigned int uint_t;

# Construction and Member Functions

    explicit unit(double x = 0.0);
    double value() const;
    operator double () const;

value() メソッドは，インスタンスが保持している値をその単位で表した場合の値を返します． これに対して，インスタンス自体を参照した場合は，基準となる値に変換した値を返します．

# Operators

    unit& operator=(double x);

    unit& operator+=(double x);
    unit& operator-=(double x);
    unit& operator*=(double x);
    unit& operator/=(double x);

いずれの演算子も引数に指定する値は，そのクラスで定義された単位で表された値である必要があります．

# Referrence

1. Faith and Brave - C++で遊ぼう - C++0x ratio