c++ - 是否可以根据另一个硬编码数组的数据自动生成硬编码数组?

标签 c++ arrays hardcode

例如,我有一对数组(它是一个静态变量)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[] 甚至不需要修改代码其他部分的设计模式?

最佳答案

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

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 中。不过,我不确定这是否真的有任何有意义的收获。

关于c++ - 是否可以根据另一个硬编码数组的数据自动生成硬编码数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864981/

相关文章:

c++ - Opencv 3 SVM trainAuto 是否也缩放标签?

c++ - 如何将 ANSI 格式文件转换为 Unicode

c++ - 奇怪的编译器错误和模板继承

不分配变量的 Python 列表

cross-compiling - 为什么 libtool 会抛出 "unsupported hardcode properties"错误,它们是什么意思?

node.js - 有没有办法避免使用 Mongoose 进行硬编码?

c++ - 将 C++ 数组写入文件,避免创建 std::string

javascript - 数组上的 .indexOf 函数在使用 JavaScript 的 IE7/8 中不起作用

c - 如何正确使用 fscanf 仅将需要的信息存储在数组中?

javascript - 在 JS 对象数组中,我应该使用键来标识每个对象吗?