Boost.Ratio + Boost.MPL で遊んでみた
Boost 1.47.0 が待ちきれなかったので、適当にここら辺から落としてきて遊んでみました。
まぁ、Boost.Ratio + Boost.MPL を試しただけなのであんまり面白いものではありませんが…。
[ソース]
#define BOOST_RATIO_EXTENSIONS #include <boost/mpl/assert.hpp> #include <boost/mpl/int.hpp> #include <boost/mpl/multiplies.hpp> #include <boost/ratio/ratio.hpp> #include <boost/ratio/mpl/equal_to.hpp> #include <boost/ratio/mpl/plus.hpp> #include <boost/ratio/mpl/minus.hpp> #include <boost/ratio/mpl/times.hpp> #include <boost/ratio/mpl/divides.hpp> namespace mpl = boost::mpl; // 比較 BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<3,2>, boost::ratio<3,2> > )); BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<3,2>, boost::ratio<6,4> > )); BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<3,2>, boost::ratio<6,4> > )); // これはダメっぽい。 // BOOST_MPL_ASSERT(( mpl::equal_to< // boost::ratio<3,2>, // mpl::divides<mpl::int_<3>, mpl::int_<2> > // > )); BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<4,2>, mpl::int_<2> > )); // 加算 BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<2,3>, mpl::plus< boost::ratio<1,3>, boost::ratio<1,3> > > )); BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<2,3>, mpl::plus< boost::ratio<2,6>, boost::ratio<1,3> > > )); BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<7,3>, mpl::plus< boost::ratio<2,6>, mpl::int_<2> > > )); BOOST_MPL_ASSERT(( mpl::equal_to< mpl::int_<1>, mpl::plus< boost::ratio<2,6>, boost::ratio<4,6> > > )); // 減算 BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<-1,6>, mpl::minus< boost::ratio<3,2>, boost::ratio<5,3> > > )); // 乗算 BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<15,6>, mpl::multiplies< boost::ratio<3,2>, boost::ratio<5,3> > > )); // 除算 BOOST_MPL_ASSERT(( mpl::equal_to< boost::ratio<9,10>, mpl::divides< boost::ratio<3,2>, boost::ratio<5,3> > > )); int main(){ return 0; }
Boost.Ratio 側で、Boost.MPL に対応しているのでコンパイル時に有理数の計算が出来るみたいです。
実際にどうなってるのかはよく分かっていませんが。
Boost.Ratio の MPL は、
#define BOOST_RATIO_EXTENSIONS
を定義しないと動かないみたいなので、注意。
ドキュメントをあまり読んでないので、もしかしたら違うかも。
あと mpl::multiplies なんて(ドキュメントに)なかったんですね、知りませんでした。