问题描述
我需要写这个函数fibo。 如果数字太大,则应显示为编译错误(主函数的最后一行) 主要功能应保持原样。 有什么建议吗?
#include <iostream>
int fibo(int n)
{
if (n <= 1)
return n;
//if (n>=300) throws ... ?
return fibo(n - 1) + fibo(n - 2);
}
int main()
{
static_assert(fibo(7) == 34);
const int k = fibo(9);
std::cout << k << std::endl;
const int l = fibo(300); // 300th Fibonacci number is large for int
}
解决方法
您可以将fibo
设为constexpr
函数,然后将throw
设为自变量无效。如果在编译时评估throw
,则constexpr
函数中的fibo
会导致编译时错误,否则会导致运行时错误:
constexpr int fibo(int n)
{
if (n >= 300) throw;
if (n <= 1) return n;
return fibo(n-1) + fibo(n-2);
}
,您可以像这样使用它:
int j = fibo(300); // run time error
constexpr int k = fibo(300); // compile time error
这里是demo。
请注意,static_assert
的定义内不能fibo
,因为条件取决于函数参数,该参数不是常数表达式。