Boost C++ Librariesのドキュメントを眺めていたら、Boost.Units 1.1.0というのが目についた。ドキュメントを読んでみるとどうも値と単位をひもづけて扱えるようになるらしい。
数値計算のときに単位付きで変数を用意できたら、途中の単位換算で桁を間違えたりしなくてすむ。というよりも単位換算を意識しなくてすむと思うとかなり楽になりそうだ。しかも、テンプレートメタプログラミングで実装しており、実行時のオーバーヘッドはないとのことだ。
早速さわってみる。どうもSI単位系とCGS単位系があるようだ。たぶんSI単位系しか使わない気がする。とりあえず、変数を作って表示をしてみる。
- #include <iostream>
- #include <cstdlib>
- #include <boost/units/systems/si.hpp>
- #include <boost/units/systems/si/prefixes.hpp>
- // prefixes.hppがないと、cnetiとかmilliとかつかえない
- #include <boost/units/pow.hpp>
- using namespace std;
- using namespace boost::units;
- using namespace boost::units::si;
- int main(int argc, char* argv[])
- {
- quantity<length> x(1.5*milli*meter);
- quantity<length> y(1.5*centi*meter);
- quantity<velocity> v(1.0 * meter / second);
- quantity<energy> e(1.0 * kilogram * pow<2>(v) );
- cout << "x = " << x << endl;
- cout << "y = " << y << endl;
- cout << "x * y = " << x * y << endl;
- cout << "v = " << v << endl;
- cout << "e = " << e << endl;
- return EXIT_SUCCESS;
- }
quantity<タイプ> 変数名(単位付きの値)と宣言して、あとは普通に使えばいいようだ。上のコードを実行すると以下のようになる。
- x = 0.0015 m
- y = 0.015 m
- x * y = 2.25e-05 m^2
- v = 1 m s^-1
- e = 1 m^2 kg s^-2
派手さはないが、かなり使い勝手がいいと思う。
コメント