ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。 長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。 系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。 それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。 以下、サンプルです。
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
using namespace boost::multiprecision;
int main() {
number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> > bi = 323456789012;
number<cpp_dec_float<50> > bf( "123456789012.3456" );
std::cout << bi << std::endl;
std::cout << bf << std::endl;
bf = static_cast< number<cpp_dec_float<50> > >( bi );
std::cout << bf << std::endl;
double m;
boost::int32_t e;
bf.backend().extract_parts(m,e);
std::cout << "mantissa = " << m << ", exponent = " << e << std::endl;
std::cout << "isint ? " << bf.backend().isint() << std::endl;
return 0;
}