boost::units

トップページ > 拡張データ型 >

abstract

必要なヘッダ
<boost/units/systems/si.hpp> SI単位系,
<boost/units/*> 他色々
出来ること
単位つき演算
リファレンス
en

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <boost/units/pow.hpp>
#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/prefixes.hpp>
using namespace std;

int main()
{
	using namespace boost::units;
	using namespace boost::units::si;

	quantity<velocity> c( 299792458.0 * meter/second ); // 光速度
	quantity<energy>   e( 1.0 * kilogram * pow<2>(c) ); // e=mc^2
	cout << e << endl;

	quantity<length> x( 1.5*meter ); // 長さ 1.5m
	quantity<length> y( 120*centi*meter ); // 長さ 120cm
	cout << x+y << endl; // 足し算
	cout << x*y << endl; // 掛け算(面積?)

	// quantity<velocity> v( x ); // コンパイルエラー:長さは速さではない
	quantity<velocity> v( x / second ); // OK
}

出力例

8.98755e+016 m^2 kg s^-2
2.7 m
1.8 m^2

etc

長さも重さも変数の型は double で表現していて、 うっかり引数の順番を間違えてしまったりすることは無いでしょうか。 ちょっと複雑な物理シミュレーションの式を書いていて、 掛け算を1個忘れてしまったりすることは無いでしょうか。 あるいは、radian と degree がごちゃごちゃに混ざって変換を間違えてしまったりすることは……

……というときに、型に単位の情報まで含めてチェックできるようにしてしまおう!という、 テンプレートメタプログラミングの古典のようなテーマがありますが、 それをきっちり実装したのがこのライブラリです。デフォルトでは上記の例のように quantity 型は単位付き double 型になりますが、第二テンプレート引数で型を指定することで、 int や complex 型を使うことも可能です。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0