【发布时间】:2018-06-25 16:11:48
【问题描述】:
很容易以递归方式实现constexpr 10 的幂:
template<int exp, bool = (exp > 0)>
struct pow10 {
static constexpr double value = pow10<exp - 1>::value * 10.0;
};
template<>
struct pow10<0, false> {
static constexpr double value = 1.0;
};
template<int exp>
struct pow10<exp, false> {
static constexpr double value = pow10<exp + 1>::value / 10.0;
};
template<int exp>
static constexpr double pow10_v = pow10<exp>::value;
static_assert(pow10_v<-3> == 1e-3, "");
static_assert(pow10_v<2> == 1e2, "");
是否有可能以非递归方式使constexpr 10 的幂?
仅供参考,我正在使用 VS2015,它在 C++14 中不支持relaxed-constexpr,因此,我不能在constexpr 函数中使用 for-loop。
【问题讨论】:
-
“编译时计算”与“常量表达式”或“constexpr”不同。如果你想要一个常量表达式,那么不(不知道你为什么想要一个)。大多数现代编译器都会在编译时愉快地计算
pow。请注意,无法保证pow(10,-3) == 1e-3在运行时或编译时计算。 -
@n.m.谢谢你。我编辑了问题以明确。
-
必须是模板元程序吗?使用令牌粘贴创建
1E<power>的宏怎么样? -
为什么需要 constexpr,为什么需要非递归解决方案?
-
@Barmar 我需要模板元功能。 @n.m。好吧,从根本上说,我只是想知道这种技术。需要
constexpr才能将其用作元函数。
标签: visual-studio-2015 c++14 template-meta-programming constexpr pow