C++ 同一函数的两个版本(用于内联或constexpr)
对于C++ 同一函数的两个版本(用于内联或constexpr),c++,function,inline,constexpr,C++,Function,Inline,Constexpr,对于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 re
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;
}
constexpr int-fact(intx){//在编译时使用它
返回x==0?1:事实(x-1)*x;
}
int-fact(int-x){//用于实际调用
int-ret=1;
对于(int i=1;i
同样,您是否也可以为内联情况创建一个特殊函数?由于C++14,循环形式是有效的
constepr
,根据(),因此添加了constepr
的第二个形式是有效的。
不幸的是,并非所有编译器都支持这个(最新版本的Visual C++没有,但是最新的CLAN和GCC的显然是这样做的(但是我不能测试这个))。
在这种情况下,您可以:
- 依赖编译器优化,并使用第一个版本(您可能希望针对特定的编译器进行测试)
- 为这两个表单指定不同的名称(例如
函数的constepr
,并确保仅在其参数也是fact\u const
时使用constepr
版本(我不知道如何实际检查是否是这种情况)constepr
- 等待编译器发布支持此功能的更新