微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 具有constexpr的查找表

我正在寻找一个坐标的查找表,如下所示:
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

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

解决方法

我将首先转储代码,稍后在必要/适当的情况下添加引用和注释.如果结果有点接近你正在寻找的话,请留下评论.

指数为了扩展包(在这里需要应用生成器),由Xeothis answer修改为使用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';
    }
}

原文地址:https://www.jb51.cc/c/114548.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐