首頁>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

如何建立這樣的編譯時間陣列?

最新回復
  • 5月前
    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';
        }
    }
    

  • 5月前
    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';
    }
    

  • 5月前
    3 #

    使用GNU gperf或其他一些代碼生成實用程式怎麼办?

  • jsf 2:在資源束中本地化列舉值
  • delphi:如何更改外部宣告的函式的實現(绕行)