首页>Program>source

我要创建一个坐标查找表,类似:

int a[n][2] = {{0,1},{2,3}, ... }

对于给定的 n ,在编译时创建.我开始调查 constexpr ,但似乎是一个返回 constexpr std::vector<std::array <int, 2> >的函数 我无法得到这样的选择:

invalid return type 'std::vector<std::array<int, 2ul> >' of constexpr function

如何创建这样的编译时间数组?

最新回答
  • 2021-1-12
    1 #

    我将首先转储代码,然后在必要时/适当时添加引用和注释.如果结果与您要寻找的结果有些接近,请发表评论。

    Xeo从这个答案修改包扩展的索引技巧(在此处应用生成器是必需的),已修改为使用 std::size_t 代替 unsigned

    #include <cstddef>
    // by Xeo, from https://stackoverflow.com/a/13294458/420683
    template<std::size_t... Is> struct seq{};
    template<std::size_t N, std::size_t... Is>
    struct gen_seq : gen_seq<N-1, N-1, Is...>{};
    template<std::size_t... Is>
    struct gen_seq<0, Is...> : seq<Is...>{};
    

    发电机功能:

    #include <array>
    template<class Generator, std::size_t... Is>
    constexpr auto generate_array_helper(Generator g, seq<Is...>)
    -> std::array<decltype(g(std::size_t{}, sizeof...(Is))), sizeof...(Is)>
    {
        return {{g(Is, sizeof...(Is))...}};
    }
    template<std::size_t tcount, class Generator>
    constexpr auto generate_array(Generator g)
    -> decltype( generate_array_helper(g, gen_seq<tcount>{}) )
    {
        return generate_array_helper(g, gen_seq<tcount>{});
    }
    

    用法示例:

    // some literal type
    struct point
    {
        float x;
        float y;
    };
    // output support for `std::ostream`
    #include <iostream>
    std::ostream& operator<<(std::ostream& o, point const& p)
    {  return o << p.x << ", " << p.y;  }
    // a user-defined generator
    constexpr point my_generator(std::size_t curr, std::size_t total)
    {
        return {curr*40.0f/(total-1), curr*20.0f/(total-1)};
    }
    int main()
    {
        constexpr auto first_array = generate_array<5>(my_generator);
        constexpr auto second_array = generate_array<10>(my_generator);
        std::cout << "first array: \n";
        for(auto p : first_array)
        {
            std::cout << p << '\n';
        }
        std::cout << "========================\n";
        std::cout << "second array: \n";
        for(auto p : second_array)
        {
            std::cout << p << '\n';
        }
    }
    

  • 2021-1-12
    2 #

    使用C ++ 14,您不需要太多模板魔术.这是一个如何为 f(x) = x^3建立查询表的示例 第一个坐标是 x 值,第二个坐标是 f(x) 值:

    #include <iostream>
    template<int N>
    struct Table
    {
        constexpr Table() : values()
        {
            for (auto i = 0; i < N; ++i)
            {
                values[i][0] = i;
                values[i][1] = i * i * i;
            }
        }
        int values[N][2];
    };
    int main() {
        constexpr auto a = Table<1000>();
        for (auto x : a.values)
            std::cout << "f(" << x[0] << ") = " << x[1] << '\n';
    }
    

  • 2021-1-12
    3 #

    使用GNU gperf或其他一些代码生成实用程序怎么办?

  • jsf 2:在资源束中本地化枚举值
  • delphi:如何更改外部声明的函数的实现(绕行)