使用constexpr
,可以根据参数在编译时或运行时评估函数。但通常,编译时和运行时的算法必须不同。例如。考虑阶乘的 constexpr 版本。
constexpr int fact(int n)
{
return (n)?n*fact(n-1):1;
}
如果n
发生在运行时,该函数会不会比一个 forloop 效率低?是否有一些模板魔术来确定函数是在编译时执行还是在运行时执行并使用不同的算法?
更新:
阶乘只是一个例子。如果不受限制地编码,所有constexpr
功能是否都像它们一样有效?constexpr
例如:
constexpr int combinations(int n, int k)
{
//Assume all error conditions and edge conditions are taken care with ternary operator ?:
return fact(n)/(fact(k)*fact(n-k);
}
如果函数是在运行时编写的,它可以从Memoization中受益。即使这是可能的,我想也很难表达这个函数,使其constexpr
在运行时既高效又尽可能高效。