例如,factorial(n),如果参数是一个常量(表达式),那么结果是确定性的,并且可以在编译时完成(通过使用模板元编程)。
是否可以只编写一个函数,这样无论何时调用它,如果参数是一个常量,那么结果将在编译时计算,如果它是一个变量,那么它将在运行时进行计算?
例如,factorial(n),如果参数是一个常量(表达式),那么结果是确定性的,并且可以在编译时完成(通过使用模板元编程)。
是否可以只编写一个函数,这样无论何时调用它,如果参数是一个常量,那么结果将在编译时计算,如果它是一个变量,那么它将在运行时进行计算?
这正是constexpr
函数存在的目的。constexpr
函数是在 C++11 中引入的。当使用可以在编译时求值的常量表达式调用时,它们往往会在编译时求值(有时您可以强制这种情况发生)。但是,一般情况下无法提供保证。否则,它们会在运行时进行评估(并且您可以像使用在运行时计算的常量或非常量参数的常规函数一样调用它们)。
除了无法保证它们的编译时评估之外,一个constexpr
函数也有一些限制:它必须只包含一个 return 语句,所以如果你正在寻找一种方法来执行任何复杂的计算,这不适合您的需求。然而,constexpr
函数可能是最接近您正在寻找的东西。
既然你提到了函数的例子,factorial()
下面是函数的样子constexpr
:
#include <iostream>
using namespace std;
constexpr int factorial(int n)
{
return (n == 0) ? 1 : factorial(n - 1);
}
int foo()
{
int result = 1;
// do some processing...
return result;
}
int main()
{
int v[factorial(5)]; // Evaluated at compile-time
cout << factorial(foo()); // Evaluated at run-time
}