Форум программистов, компьютерный форум CyberForum.ru

В цикле пройти по полям структуры - C++

Восстановить пароль Регистрация
 
Kverza
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 42
29.06.2016, 11:54     В цикле пройти по полям структуры #1
Доброго времени суток! Имеется структура данных
C++
1
2
3
4
5
6
7
8
9
struct Rules
    {
    public:
        std::string left;
        std::string rule1;
        std::string rule2;
        std::string rule3;
        ...
     }
Вопрос следующий - можно ли в цикле при помощи указателей пройтись по полям этой структуры?

Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shilko2013
 Аватар для shilko2013
238 / 215 / 116
Регистрация: 02.04.2016
Сообщений: 814
Завершенные тесты: 1
29.06.2016, 12:10     В цикле пройти по полям структуры #2
В структуре писать public не надо и пройтись циклом нельзя, так как у разных компиляторов расположение полей может быть разное. Почитайте про выравнивание данных...
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 1
29.06.2016, 12:33     В цикле пройти по полям структуры #3
Kverza, что ты имеешь ввиду при помощи указателей пройтись по полям этой структуры?? Ты хочешь создать указатель на объект этой структуры и при помощи него в цикле получать доступ к каждому полю? И еще, ты пишешь три точки, это намек на то, что кол-во rule'ов неизвестно? В таком случае что-то типа std::vector<std::string> rules может помочь. Но я все равно не понимаю твоего вопроса из-за отсутствия контекста. Что ты будешь делать и как устроена структура, скажи пожалуйста.
Kverza
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 42
29.06.2016, 12:43  [ТС]     В цикле пройти по полям структуры #4
Ну, начнем по порядку)

1. да, хочу создать указатель на структуру, с целью обращаться к каждому из rule отдельно. Хотелось, как вариант, получить адрес первого, а потом смещениями добраться до второго, и т.д.

2. Нет, три точки значат, что их 6 штук строго, просто немного лень было писать) Позже я делаю
C++
1
std::vector<Rules*>
notAll
176 / 65 / 16
Регистрация: 27.05.2016
Сообщений: 182
Завершенные тесты: 2
29.06.2016, 12:45     В цикле пройти по полям структуры #5
Есть такой вариант на бусте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/algorithm.hpp>
 
struct Rules
{
    std::string left = "left";
    std::string rule1 = "rule1";
    std::string rule2 = "rule2";
    std::string rule3 = "rule3";
};
 
BOOST_FUSION_ADAPT_STRUCT(
    Rules,
    (BOOST_FUSION_ADAPT_AUTO, left),
    (BOOST_FUSION_ADAPT_AUTO, rule1),
    (BOOST_FUSION_ADAPT_AUTO, rule2),
    (BOOST_FUSION_ADAPT_AUTO, rule3)
    )
 
struct value_printer
{
    template <typename U>
    void operator()(const U& x) const
    {
        std::cout << x << '\n';
    }
};
 
int main()
{
    Rules rls;
    boost::fusion::for_each(rls, value_printer());
}
online
Kverza
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 42
29.06.2016, 13:03  [ТС]     В цикле пройти по полям структуры #6
notAll, Буст это круто, но я его не использую. То что Вы предложили является абсолютно верным, но надо без буст
shilko2013
 Аватар для shilko2013
238 / 215 / 116
Регистрация: 02.04.2016
Сообщений: 814
Завершенные тесты: 1
29.06.2016, 13:09     В цикле пройти по полям структуры #7
Я бы не рисковал, другой процессор по другому расставит машинные слова и получится бурда.
Kverza
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 42
29.06.2016, 13:23  [ТС]     В цикле пройти по полям структуры #8
shilko2013, а чисто с технической стороны такого можно добиться?
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
29.06.2016, 13:28     В цикле пройти по полям структуры #9
Цитата Сообщение от Kverza Посмотреть сообщение
а чисто с технической стороны такого можно добиться
Зачем?
Вот это
Цитата Сообщение от Kverza Посмотреть сообщение
C++
1
2
3
std::string rule1;
std::string rule2;
std::string rule3;
Называется "китайский код".

Что вам мешает сделать так:

C++
1
2
3
4
5
6
7
struct Rules
    {
    public:
        std::string left;
        std::string rule[3];
        ...
     }
DrOffset
6430 / 3804 / 882
Регистрация: 30.01.2014
Сообщений: 6,605
29.06.2016, 13:29     В цикле пройти по полям структуры #10
Kverza, почему вот так не сделать?
C++
1
2
3
4
struct Rules
{
    std::string rules[6];
};
shilko2013
 Аватар для shilko2013
238 / 215 / 116
Регистрация: 02.04.2016
Сообщений: 814
Завершенные тесты: 1
29.06.2016, 13:30     В цикле пройти по полям структуры #11
Kverza, Да, при условии что процессоры и машины будут одинаковые(на которых программу будешь запускать).
На одном процессоре получится, на другом нет).
C++
1
2
3
4
5
6
7
8
9
10
    struct S {
        int a = 1, b = 2;
    };
    S t;
    int * p = &t.a;
    p++;
    if (*p == t.b)
        cout << "Получилось!";
    else
        cout << "Неудача";
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2016, 13:33     В цикле пройти по полям структуры
Еще ссылки по теме:

C++ Доступ к полям структуры по номерам
C++ Как обратиться к полям объединения, которое находится внутри структуры?
Ошибка при доступе к полям структуры C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kverza
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 42
29.06.2016, 13:33  [ТС]     В цикле пройти по полям структуры #12
avgoor, Ничего не мешает, идея массива в голову как то не пришла...

Добавлено через 1 минуту
DrOffset, да, это правильно. Не могу сказать почему сразу так не сделал
Yandex
Объявления
29.06.2016, 13:33     В цикле пройти по полям структуры
Ответ Создать тему
Опции темы

Текущее время: 14:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru