например, у меня есть массив пар (который является статической переменной) 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 [] вручную или даже без необходимости изменять другие части кода?
Одним очевидным ответом будет использование вектора вместо массива:
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; их нелегко инициализировать.
С 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;
}