サンプルの動作確認バージョン [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
長さも重さも変数の型は double で表現していて、 うっかり引数の順番を間違えてしまったりすることは無いでしょうか。 ちょっと複雑な物理シミュレーションの式を書いていて、 掛け算を1個忘れてしまったりすることは無いでしょうか。 あるいは、radian と degree がごちゃごちゃに混ざって変換を間違えてしまったりすることは……
……というときに、型に単位の情報まで含めてチェックできるようにしてしまおう!という、 テンプレートメタプログラミングの古典のようなテーマがありますが、 それをきっちり実装したのがこのライブラリです。デフォルトでは上記の例のように quantity 型は単位付き double 型になりますが、第二テンプレート引数で型を指定することで、 int や complex 型を使うことも可能です。