Search code examples
c++boostinitializermultiprecision

Use static data initializers inline


I have found this section in the cpp_dec_float source file:

struct initializer
  {
     initializer()
     {
        cpp_dec_float<Digits10, ExponentType, Allocator>::nan();
        cpp_dec_float<Digits10, ExponentType, Allocator>::inf();
        (cpp_dec_float<Digits10, ExponentType, Allocator>::min)();
        (cpp_dec_float<Digits10, ExponentType, Allocator>::max)();
        cpp_dec_float<Digits10, ExponentType, Allocator>::zero();
        cpp_dec_float<Digits10, ExponentType, Allocator>::one();
        cpp_dec_float<Digits10, ExponentType, Allocator>::two();
        cpp_dec_float<Digits10, ExponentType, Allocator>::half();
        cpp_dec_float<Digits10, ExponentType, Allocator>::double_min();
        cpp_dec_float<Digits10, ExponentType, Allocator>::double_max();
        cpp_dec_float<Digits10, ExponentType, Allocator>::long_double_max();
        cpp_dec_float<Digits10, ExponentType, Allocator>::long_double_min();
        cpp_dec_float<Digits10, ExponentType, Allocator>::long_long_max();
        cpp_dec_float<Digits10, ExponentType, Allocator>::long_long_min();
        cpp_dec_float<Digits10, ExponentType, Allocator>::ulong_long_max();
        cpp_dec_float<Digits10, ExponentType, Allocator>::eps();
        cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(0);
     }
     void do_nothing(){}
  };

I'd like to use some of those values such as zero, one, two, and half rather than declaring global const variables.

Is it possible to use those values inline? If so, how?

Example:

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main()
{
    typedef mp::number<mp::cpp_dec_float<100>> mp_type;
    mp_type test_num("7.0710678");

    test_num *= mp_type.two();

    std::cout << test_num.str( 0, std::ios_base::scientific ) << '\n';
}

Solution

  • boost::multiprecision::number repeats its first template argument as a public member type backend_type. So,

    test_num = test_num * mp_type::backend_type::two();