Функция-член получает объекты, каждый из которых имеет два или более члена, которые являются массивами (стиль C, T[]
) одного типа. Как можно сопоставить эти массивы одного объекта в один? Например, for
-loop можно использовать для перебора «объединенного» массива. Объекты имеют одинаковый классификатор. Нельзя предполагать, что элементы массива находятся в смежном пространстве памяти. Элементы массива на самом деле не должны копироваться или перемещаться.
Я думал об использовании указателя на элементы данных . Можно определить указатели на элементы массива . Согласно этому ответу :
очень хорошо известно компилятору, который является смещением массива от полного объекта и является смещением элемента массива в пределахмассив, и компилятор знает, как добавить
Например, в следующем коде я попытался выполнить его для функции-члена process()
:
#include <iostream>
using namespace std;
constexpr size_t As = 3;
constexpr size_t Bs = 2;
struct Parts
{
char a[As] = { 'A', 'B', 'C'};
char b[Bs] = { 'D', 'E'};
};
class Processor
{
void run(const char& o) const { cout << o << endl; }
??? abs[As + Bs];
public:
Processor()
{
size_t i = 0;
for(; i<As; ++i) abs[i] = &Parts::a[i];
for(; i<As+Bs; ++i) abs[i] = &Parts::b[i-As];
}
void process(const Parts& m) const { for(char& o: m.*abs) run(o); }
};
int main()
{
Parts m, n;
Processor p;
p.process(m);
p.process(n);
return 0;
}
Член abs[]
должно быть непрерывным представлением объединенных массивов a
и b
.
Возможно ли это вообще? Может быть есть какой-то другой способ зацикливания элементов массива отдельных массивов одного объекта?