所以我在这里写了一个答案:https ://stackoverflow.com/a/56569397/2642059它努力log2
在编译时计算,如下所示:
template <unsigned int x>
constexpr enable_if_t<x != 0U, int> log2 = 1 + log2<x / 2U>;
template <>
constexpr int log2<1U> = 0;
这很好用,但我觉得我不应该专注于:
template <unsigned int x>
constexpr enable_if_t<x != 0U, int> log2 = x < 4U ? 1 : 1 + log2<x / 2U>;
但这给了我错误:
代替
template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = (0u != 0u); _Tp = int]
:
prog.cpp:7:61:从 prog.cpp:7:61 递归需要constexpr std::enable_if_t<true, int> log2<4u>
:从constexpr std::enable_if_t<true, int> log2<8u>
prog.cpp:10:11 需要:从这里需要 /usr/include/c++/6/type_traits:2523:61 : 错误: 没有在中命名type
的类型struct std::enable_if<false, int>
有没有办法可以防止编译器将递归展开得太远?