对于常量参数或变量参数,是否可以使函数表现不同?

时间:2013-01-27 22:05:28

标签: c++ function arguments metaprogramming compile-time

例如,factorial(n),如果参数是常量(表达式),那么结果是确定性的,并且可以在编译时完成(通过使用模板元编程)。

是否可以只编写一个函数,这样无论何时调用它,如果参数是常量,那么结果将在编译时计算,如果它是一个变量,那么它将在运行时进行计算时间?

1 个答案:

答案 0 :(得分:5)

这正是constexpr函数的存在。 {C} 11中引入了constexpr个函数。当使用可在编译时计算的常量表达式调用时,它们往往会在编译时进行求值(有时您可以强制执行此操作)。但是,通常不可能提供保证。否则,它们在运行时进行评估(您可以像在运行时计算的常量或非常量参数的常规函数​​一样调用它们)。

除了缺乏对编译时评估的保证之外,constexpr函数有一些限制:它必须只包含一个单一的返回语句,所以如果你正在寻找对于执行任何复杂性计算的方法,这将不适合您的需求。尽管如此,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
}