对于 constexpr
函数,唯一的选择是使用递归函数,除了简单的事情之外。问题在于,递归函数在运行时的开销非常大(尤其是当您要多次调用自己时)。
那么是否可以实现两个函数,一个用于 constexpr
,另一个用于正常使用:
constexpr int fact(int x){ //Use this at compile time
return x == 0 ? 1 : fact(x-1)*x;
}
int fact(int x){ //Use this for real calls
int ret = 1;
for (int i = 1; i < x+1; i++){
ret *= i;
}
return ret;
}
同样,您也可以为内联情况创建一个特殊的函数吗?
最佳答案
自 C++14 起,根据 ( http://en.cppreference.com/w/cpp/language/constexpr ),循环形式是有效的 constexpr
,因此添加了 constexpr
的第二种形式是有效的。
不幸的是,并非所有编译器都支持这一点(最新版本的 Visual C++ 不支持,但最新的 Clang 和 GCC 显然支持(但我无法测试这一点))。
在这种情况下,您可以:
- 依赖编译器优化,并使用第一个版本(您可能想针对您的特定编译器进行测试)
- 为这两种形式指定不同的名称(例如
constexpr
函数的fact_const
,并确保仅使用constexpr
版本参数也是 constexpr (我不知道如何实际检查是否是这种情况) - 等待您的编译器发布支持此功能的更新。
关于c++ - 同一函数的两个版本(用于内联或 constexpr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993505/