2014-09-18 2 views
2

Поскольку программирование становится более сложным и становится очевидным необходимость выполнять операции с данными структуры. Есть ли способ преобразования для преобразования типа структуры в массив своих членов таким образом, чтобы:Преобразование структуры в массив

struct FooDesc Foo{ 
    int num_Foo; 
    int num_Bar; 
    int GreenFoo; 
}; 

могут быть представлены:

int Bar[2]; 

Или лучше, динамически:

vector<int> Bar; 

Целью является преобразование или повторное представление структуры данных в виде итерационной формы без чрезмерного использования оператора присваивания.

+0

Почему бы не провести массив в структуре? – juanchopanza

+3

'int Bar [2]' - no. 'int Bar [3]' - да. –

+0

@juanchopanza Фактическая реализация содержит внушительное количество членов, определяющих свойства элемента, которые должны быть записаны в файл. Я боюсь создать беспорядок для нечитаемых данных для моих глаз. Но я также хочу иметь возможность добавлять «специальные» свойства. –

ответ

4

Вы можете использовать неназванные struct с, чтобы сделать гибрид struct где его член может рассматриваться как массив:

struct Foo { 
    union { 
    struct { 
     int x; 
     int y; 
     int z; 
    }; 
    struct { 
     int array[3]; 
    }; 
    }; 
}; 

LIVE DEMO

Однако обратите внимание, что неназванный struct происходит от C11 и его не стандартная функция C++. Он поддерживается как расширение, хотя и GCC, а также Clang.

+0

Объединение создает указатель на одно местоположение данных для обоих представлений? Это очень полезно! –

+0

Реализация работала без проблем. (VS2013) Это решение открыло дверь для 'vector ' назначение для добавления всех необходимых данных в один динамический массив. Следующая задача - создать конструкцию для обработки структур с переменными типами, которые я предполагаю. –

2

Как насчет:

vector <Foo> Bar; 

Вы можете добавить экземпляры вашей структуры, а затем получить доступ к каждому элементу необходимо, используя массив типа формата.

Смотрите этот родственный вопрос для получения дополнительной информации:

Vector of structs initialization

После перечитывая свой вопрос несколько раз, я думаю, что я неправильно понял ваше намерение и ответил на «неправильный вопрос». Вы можете создать массив своей структуры, как указано выше, и проиндексировать его как массив, но я не считаю, что это довольно просто, чтобы сделать каждый элемент структуры другим элементом массива. Если вы хотите создать массив структур, мой ответ должен помочь. Если вы хотите, чтобы каждый элемент вашей структуры являлся элементом вашего массива, ответ 40two должен помочь вам.

2

Если ваши структуры являются POD, вы можете использовать std :: tuple вместо structs. Затем вы можете использовать различные шаблоны для работы через членов кортежа.

Вот простой пример, который печатает элементы кортежа - с помощью наддува :: фьюжн :: кортеж вместо станда :: кортеж, поскольку он имеет гораздо больше кортежей манипулирования имеющихся возможностей:

#include <boost/fusion/tuple.hpp> 
#include <boost/fusion/include/for_each.hpp> 
#include <iostream> 

struct Printer {  
    template<typename T> 
    void operator()(const T &t) const { 
     std::cout << t << std::endl; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    boost::fusion::tuple<int, int, int, int, float> t = 
      boost::fusion::make_tuple(3, 5, 1, 9, 7.6f); 

    boost::fusion::for_each(t, Printer()); 

    return 0; 
} 

Вы можете включить их в союзы со структурой, но вы хотите провести некоторое тестирование для обеспечения правильного согласования.

Поверхность заключается в том, что эти манипуляции очень быстрые - большая часть работы выполняется во время компиляции. Нижняя сторона заключается в том, что вы не можете использовать обычные структуры управления, такие как индексирование, с индексами времени исполнения - вам нужно будет создать слой абстракции вокруг этого, поскольку обычный аксессуар get<i>(tuple) требует, чтобы i была константой времени компиляции. Независимо от того, стоит ли это, сложность сильно зависит от приложения.

+0

Мне нужно будет немного изучить его реализацию и вернуться. –

+0

Что вы хотите сделать для участников? – sfjac

+0

Просто повторите их и напишите файл. Я полагаю, что я мог бы просто выводить заголовок с данными во время вывода, но я также хотел добавить в файл несколько данных структуры - с возможностью динамического хранения дополнительных «членов». Изменить: скучные вещи: Представьте себе игровой персонаж. –

Смежные вопросы