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
    版本(我不知道如何实际检查是否是这种情况)
  • 等待编译器发布支持此功能的更新

编译时构造在运行时的成本如何?编译可能会更困难,但关键是在运行时它不需要时间。@例如,Loki,如果我不知道传递给它的是什么(比如用户的输入…在运行时无法计算),您可以检查编译器是否提供尾部调用优化。(这些信息来自八年前),这将使递归函数像显式循环一样工作。@ShadowRanger我明白了……这很好。你读过其他类似的问题吗?例如: