Как построить консолидированное представление на нескольких массивах участников? - PullRequest
0 голосов
/ 03 ноября 2019

Функция-член получает объекты, каждый из которых имеет два или более члена, которые являются массивами (стиль 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.

Возможно ли это вообще? Может быть есть какой-то другой способ зацикливания элементов массива отдельных массивов одного объекта?

1 Ответ

0 голосов
/ 03 ноября 2019

Это не может быть реализовано по нескольким причинам.

Прежде всего, элементы массива должны находиться в непрерывном пространстве памяти.

Кроме того, как указано в этот ответ :

доступ к элементу в массиве - это еще один уровень косвенного обращения к простому int

Согласно этому комментарию : [Определение какого-либо видадвойного косвенного обращения к данным члена] не может быть сделано с языком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...