【问题标题】:is it possible to generate hardcode array according to data of another hardcode array automatically?是否可以根据另一个硬编码数组的数据自动生成硬编码数组?
【发布时间】:2023-05-27 05:18:02
【问题描述】:

例如,我有一个对数组(它是一个静态变量)a[],它表示点 A、B、C 的坐标:

pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}};

我想要另一个数组 b[] 来存储 AB 和 BC 的长度:

float MyClass::b[sizeof(a)/sizeof(pair<float,float>)-1]={
    sqrt((a[1].first-a[0].first)*(a[1].first-a[0].first)+(a[1].second-a[0].second)*(a[1].second-a[0].second)),
    sqrt((a[2].first-a[1].first)*(a[2].first-a[1].first)+(a[2].second-a[1].second)*(a[2].second-a[1].second))
};

但是 b[] 不是很容易维护,因为如果我向 a[] 添加元素,我需要手动更改 b[]。有没有可以自动生成 b[] 的方法?有没有类似的东西,例如:宏

float b[]={MACRO(a)};

float b[]={MACRO(sizeof(a)/sizeof(pair<float,float>))};

或模板:

template<int i>
struct s{
    float b[]={something a[i+1]-a[i]};
};

s<sizeof(a)/sizeof(pair<float,float>)> _s;

或其他允许我更改 a[] 大小而无需手动更改 b[] 甚至无需修改其他代码部分的设计模式?

【问题讨论】:

  • 使用std::vectorfor 循环来填充它。

标签: c++ arrays hardcode


【解决方案1】:

一个明显的答案是使用向量而不是数组:

template <class T, size_t N>
size_t elements(T (&array)[N]) {
    return N;
}

// could also use a vector for a, if desired:
pair<float,float> a[]={{0,0},{320,568},{640,0}};
vector<float> b;

for (int i=1; i<elements(a); i++) {
    float dx = a[i].first - a[i-1].first;
    float dy = a[i].second - a[i-1].second;
    b.push_back(sqrt(dx*dx + dy * dy));
}

这样,a 大小的更改不需要任何其他更改 b 即可正确跟踪其大小。

当然,还有其他方法可以完成这项工作。例如,如果您经常这样做,您可以将其全部包含在class 中。不过,我不确定这是否真的获得了任何有意义的东西。

【讨论】:

    【解决方案2】:

    这里最大的问题是C数组的使用;它们不容易初始化。 使用 std::array 就很简单了:

    pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}};
    auto b = sqrt(a);
    

    template<typename T, size_t N>
    std::array<T, N> sqrt(std::pair<T,T> (&points)[N])
    {
       using std::sqrt;
       std::array<T, N> retval;
       for (int i = 0; i != N; ++i) {
           retval[i] = sqrt(points[i].first * points[i].first + 
                            points[i].second * points[i].second) ;
       }
      return retval;
    

    }

    【讨论】: