10 的非递归方式的 constexpr 幂?



以递归方式实现 10 的幂非常容易constexpr

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, "");

是否可以以非递归方式使 10 的constexpr幂?

仅供参考,我使用的是VS2015,它不支持C++14中的宽松constexpr,因此,我不能constexpr函数中使用for循环。

所以,如果我理解正确,你编译了 C++14,但你的编译器并不完全符合 C++14constexpr函数。因此,您无法在constexpr函数内创建循环。

井。。。我没有你的编译器,所以我不知道你的编译器到底不支持什么,所以我提出了一个基于 C++14 解决方案,基于不使用 for 循环的非递归constexpr可变参数模板函数。井。。。两个功能:一个用于负功率,一个用于非负功率。

希望VS2015支持它。

负函数如下

模板

constexpr T negPow10 (std::index_sequence<Is...> const &)
{
using unused = std::size_t[];
T ret { 1 };
(void)unused { 0U, (ret /= 10, Is)... };
return ret;
}

非负(对于正或零幂(几乎相等,但使用ret *= 10而不是ret /= 10

它们通过以下方式调用

template <typename T, int E, std::size_t N = (E < 0 ? -E : E)>
constexpr T pow10 ()
{ return E < 0
? negPow10<T>(std::make_index_sequence<N>{})
: posPow10<T>(std::make_index_sequence<N>{}); }

下面是一个完整的编译示例(但请注意,正如 n.m. 所指出的,double功率的static_assert()是不可靠的(

#include <utility>
template <typename T, std::size_t ... Is>
constexpr T posPow10 (std::index_sequence<Is...> const &)
{
using unused = std::size_t[];
T ret { 1 };
(void)unused { 0U, (ret *= 10, Is)... };
return ret;
}
template <typename T, std::size_t ... Is>
constexpr T negPow10 (std::index_sequence<Is...> const &)
{
using unused = std::size_t[];
T ret { 1 };
(void)unused { 0U, (ret /= 10, Is)... };
return ret;
}
template <typename T, int E, std::size_t N = (E < 0 ? -E : E)>
constexpr T pow10 ()
{ return E < 0
? negPow10<T>(std::make_index_sequence<N>{})
: posPow10<T>(std::make_index_sequence<N>{}); }
int main ()
{
static_assert( pow10<long, 5>() == 1e5, "!" );
static_assert( pow10<double, -3>() == 1e-3, "!" );
}

老实说,这个解决方案在std::make_index_sequence中(或可以(有点递归。

相关内容

  • 没有找到相关文章

最新更新