c++ - 如何在运行时获取阶乘<a>....阶乘<b>?

标签 c++ templates lookup-tables

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

#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";
}

这对于少量元素来说没问题,但是当查找表包含大量元素时我该怎么办?如何在不显式写入每个元素的情况下填充数组?

阶乘仅用于示例。在更现实的场景中,我想在查找表中存储 ~1000 个元素。

最佳答案

使用 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 容器。我用过std::array ,但您可以使用任何您想要的。

关于c++ - 如何在运行时获取阶乘<a>....阶乘<b>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55543776/

相关文章:

c# - 从C#事件触发C++操作

c++ - 当其中一个函数未编译时,函数重载查找如何工作?

c++ - 将自定义类与自定义模板容器一起使用

c++ - 基于整数类型 "signed-ness"的部分模板特化?

c++ - std::map 表初始化是否优化?

c++ - 使用递归的序列到达数组末尾的最小跳转次数

c# - 将 C# 类对象传入和传出 C++ DLL 类

c++ - 在共享对象/DLL 中使用模板化类和函数

java - 我应该如何实现一个包含需要以不同语言显示的项目列表的下拉框?

c# - 在 C# 中完成查找的最快方法以及如何处理 double 值的不精确性?