对于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;
}
同样的,你可以为内联情况做一个特殊的功能吗?
答案 0 :(得分:3)
从C ++ 14开始,循环形式是一个有效的constexpr
,因为(http://en.cppreference.com/w/cpp/language/constexpr),所以添加constexpr
的第二种形式是有效的。
不幸的是并非所有的编译器都支持这个(最新版本的Visual C ++没有,但最新的Clang和GCC显然都这样做(但我无法测试))。
在这种情况下,您可以:
fact_const
函数提供两个不同的名称(例如constexpr
),并确保只有constexpr
版本的参数也是constexpr
时才使用GETDATE()
我不知道如何实际检查是否是这种情况)