两个版本的相同功能(用于内联或constexpr)

时间:2016-05-03 00:03:21

标签: 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;
}

同样的,你可以为内联情况做一个特殊的功能吗?

1 个答案:

答案 0 :(得分:3)

从C ++ 14开始,循环形式是一个有效的constexpr,因为(http://en.cppreference.com/w/cpp/language/constexpr),所以添加constexpr的第二种形式是有效的。 不幸的是并非所有的编译器都支持这个(最新版本的Visual C ++没有,但最新的Clang和GCC显然都这样做(但我无法测试))。

在这种情况下,您可以:

  • 依靠编译器优化,并使用第一个版本(您可能希望针对您的特定编译器进行测试)
  • fact_const函数提供两个不同的名称(例如constexpr),并确保只有constexpr版本的参数也是constexpr时才使用GETDATE()我不知道如何实际检查是否是这种情况)
  • 等到您的编译器发布支持此功能的更新。