代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

如何在运行时获得阶乘<a>…阶乘<b>?

  •  2
  • 463035818_is_not_an_ai  · 技术社区  · 5 年前

    我想用编译时计算的整数填充查找表:

    #include <iostream>
    #include <type_traits>
    
    template <int x> using number = std::integral_constant<int,x>;    
    template <int n> struct factorial : number<n * factorial<n-1>::value> {};
    template <> struct factorial<0> : number<1> {};
    
    int get_factorial(int x) {
        if (x < 1) return -1;
        if (x > 5) return -1;
        static constexpr int lookup_table[] = { 
            factorial<1>::value,
            factorial<2>::value,
            factorial<3>::value,
            factorial<4>::value,
            factorial<5>::value
        };
        return lookup_table[x-1];
    }
    
    int main() {        
        int x;
        std::cin >> x;
        std::cout << get_factorial(x) << "\n";
    }
    

    这个 factorial

    2 回复  |  直到 5 年前
        1
  •  3
  •   sebrockm    5 年前

    用C++ 14可以使用 std::integer_sequence :

    template <int... S>
    constexpr std::array<int, sizeof...(S)> get_lookup_table_impl(std::integer_sequence<int, S...>)
    {
        return { factorial<S>::value... };
    }
    
    template <int S>
    constexpr auto get_lookup_table()
    {
        return get_lookup_table_impl(std::make_integer_sequence<int, S>{});
    }
    

    请参阅一个完全有效的示例 here .

    诀窍在于 std::make_integer_sequence<int, S>{} 将创建的实例 std::integer_sequence<int, S...> get_lookup_table_impl factorial<S>::value... 解包并传递 S factorial std::array ,但你想用什么就用什么。

        2
  •  1
  •   Quimby    5 年前

    #include <iostream>
    #include <type_traits>
    #include <utility>
    template <int x> using number = std::integral_constant<int,x>;    
    template <int n> struct factorial : number<n * factorial<n-1>::value> {};
    template <> struct factorial<0> : number<1> {};
    
    template<std::size_t... Is>
    int get_factorial_impl(int x,std::index_sequence<Is...>)
    {
        if (x < 1) return -1;
        if (x > 5) return -1;
        static constexpr int lookup_table[] = { factorial<Is+1>::value...};
        return lookup_table[x-1];
    }
    
    int get_factorial(int x)
    {
        return get_factorial_impl(x,std::make_index_sequence<5>{});
    }
    
    int main() {        
        int x;
        std::cin >> x;
        std::cout << get_factorial(x) << "\n";
    }