我正在尝试将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);
}
有可能吗?
答案 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。