在编译时计算中使用GMP

时间:2014-10-22 03:17:19

标签: c++ c++11 gmp

我正在尝试将GMP与C ++ 11一起使用,但显然不允许在constexpr函数中使用mpz_class,因为mpz_class不是文字类型。

#include <iostream>
#include <gmpxx.h>
using namespace std;

constexpr mpz_class factorial(mpz_class n)
{
    if (n == 0) return 1;
    else return n * factorial(n - 1);
}

int main()
{
    cout << factorial(20);
}

有可能吗?

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。 GMP是一个C库,因此不可能支持C ++编译时constexpr计算。

答案 1 :(得分:2)

您可能有兴趣查看Boost.Multiprecision(BMP)库:

http://www.boost.org/doc/libs/1_56_0/libs/multiprecision/doc/html/index.html

它支持constexpr

http://www.boost.org/doc/libs/1_56_0/libs/multiprecision/doc/html/boost_multiprecision/tut/lits.html

请注意,constexpr支持仅限于cpp_int后端(BMP的任意精度整数版本)。 BMP确实提供了一个包装GMP类型的后端,所以我想在你的情况下你可以使用constexpr进行cpp_int计算,然后在运行时转换为GMP。