c++ - 同一函数的两个版本(用于内联或 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 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/

相关文章:

c# - Windows 8 商店应用程序 C++ 文件访问

从 vector 中删除时出现 C++ 段错误

c++ - 事件系统的类型安全实现

javascript - 从另一个脚本调用脚本

c# - 为什么 C# 不允许像 C++ 这样的非成员函数

r - 如何在 R 函数中使用 group_by

c++ - std::move(std::string) 不使传递的参数为空状态

css - 如何在 Contact Form 7 中格式化不一致的电子邮件字体?

f# - 使用 'inline' 和报价评估时 (+) 和 (-) 之间的行为不一致

html - 为 Gmail 构建电子邮件,我的 <img> 一直设置为隐藏