Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1

Перебор foreach для Enum

27.11.2019, 10:12. Показов 6280. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Как мне итерироваться?
C++ (Qt)
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
    enum Fields {
        FIRST_FIELD,                                ///< Служебное поле для кодирования первого
        FIRSTNAME,                                  ///< Имя
        SECONDNAME,                                 ///< Фамилия
        MIDDLENAME,                                 ///< Отчество
        AGE,                                        ///< Возраст
        SEX,                                        ///< Пол
        BIRTHDAY,                                   ///< Дата рождения
        INSURANCE,                                  ///< код полиса медицинской страховки
        HOMEADDRESS,                                ///< Домашний адрес
        WORKADDRESS,                                ///< Адрес места работы
        ID,                                         ///< Идентификатор
        LAST_FIELD                                  ///< Служебное поле для кодирования последнего
    };
 
    friend Fields  operator++(Fields &it) {
        return it = static_cast<Fields>(std::underlying_type<Fields>::type(it) + 1);
    }
 
    Fields operator*(Fields c) {
        return c;
    }
 
    Fields begin(Fields r) {
        return Fields::FIRST_FIELD;
    }
 
    Fields end(Fields r) {
        Fields l = Fields::LAST_FIELD;
        return ++l;
    }
вот так нельзя:
C++ (Qt)
1
for(const auto &it: Models::Patient::Fields())
Добавлено через 11 минут
сделал так, а проще можно?
C++ (Qt)
1
for(auto it: {Models::Patient::BIRTHDAY, Models::Patient::FIRSTNAME, Models::Patient::INSURANCE, Models::Patient::SECONDNAME, Models::Patient::SEX})
Добавлено через 22 минуты
добавил к operator* и методам begin, end - friends . Теперь работает так:
C++ (Qt)
1
for(const auto value : Models::Patient::Fields())
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2019, 10:12
Ответы с готовыми решениями:

При создании enum 'имя1' class 'имя2' ошибка use of enum 'имя1' without previous declaration
Добрый день. пишу в qt5: enum typeTable class tabty{readtxt,is,wb,wa,tp}; При сборке выдает ошибку: ...

Enum для QComboBox
Всем привет! Помогите, пожалуйста. Мне нужно сделать ComboBox с параметрами скорости COM порта. В мануале есть таблица enum которая...

Перебор Label's в foreach
есть групбокс, в нем есть два столбца меток. вроде такого label1 label4 label2 lable5 label3 label6 необходимо...

5
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
27.11.2019, 10:24
я бы вот так сделал (правда, ещё ни разу не требовалось мне итерироваться по перечислению)

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
enum class Fields:int
{
    FIRSTNAME,
    SECONDNAME,
    MIDDLENAME,
    AGE,
    SEX,
    BIRTHDAY,
    INSURANCE,
    HOMEADDRESS,
    WORKADDRESS,
    ID,
    count
};
 
int main()
{
    for(int i=0;i<(int)Fields::count;i++)
    {
        const auto enum_item=static_cast<Fields>(i);
 
        //enum_item
        //...
 
    }
 
    return 0;
}
Добавлено через 2 минуты
подправил
1
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
27.11.2019, 10:32  [ТС]
Алексей1153, в таком случае лучше сделать в классе просто enum, a не enum class. И каст к инту не нужен будет:
C++ (Qt)
1
for(int i(0); i < Models::Patient::LAST_FIELD; ++i)
ПС: я так и сделал, тк добавление всех этих перегрузок - просто излишне для меня оказалось.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
27.11.2019, 11:39
Джон Кофи, голый енум - от него всё будет торчать "наружу" в класс, мне это в нём не нравится. А так да, можно
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
27.11.2019, 11:46  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
мне это в нём не нравится
почему? он перечисляет поля этого класса. Я потом могу просто через класс обратиться к ним и норм:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
bool Patient::setData(const int field, QVariant value)
{
    switch (field) {
    case Patient::FIRSTNAME:
        setFirstname(value.toString());
        return true;
    case Patient::SECONDNAME:
        setSecondname(value.toString());
        return true;
//etc
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
27.11.2019, 11:53
Джон Кофи, я не про это. Сам enum{} не скрывает константы в области видимости "{}". То есть, вот это тоже скомпилится

C++
1
2
3
4
5
6
7
bool Patient::setData(const int field, QVariant value)
{
    switch (field) {
    case /*Patient::*/FIRSTNAME:
        return true;
    case /*Patient::*/SECONDNAME:
        return true;
с enum class строго
C++
1
2
3
4
5
6
7
bool Patient::setData(const Fields field, QVariant value)
{
    switch (field) {
    case Fields::FIRSTNAME:
        return true;
    case Fields::SECONDNAME:
        return true;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2019, 11:53
Помогаю со студенческими работами здесь

Перебор массива foreach
Здравствуйте, есть необходимость изменить значение неких элементов внутри массива. Массив такой: ( =&gt; Array ( ...

Скорость перебор вектора while/for/foreach
В php foreach для массива работает в 2 раза быстрее, чем перебор того же массива циклом while или for. Нашел на одном сайте:Но это для...

Перебор элементов в массиве в foreach
Задача простая: Найти в csv-файле массив, содержащий строку 01 и записать ее в базу - это получилось. Теперь нужно дальше пройтись по...

Перебор двух массивов в foreach
Доброго времени суток, есть два строковых массива с одинаковым количеством элементов и метод, который принимает строковые массивы в...

Перебор в foreach в обратном порядке
Доброго времени суток! Нужна помощь. Программа присваивает кнопкам порядковый номер, но он присваивается наоборот, button1 - 9, button2 - 8...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru