Ruchira Patel Ответов: 5

Как получить количество элементов перечисления?


Привет,
Я создал один struture как,
typedef enum
{
   NAME = 0,
   ADDRESS,
   BIRTHDATE,
}INFORMATION

И я хочу получить количество элементов в этой структуре. Есть ли какая-то функция?

5 Ответов

Рейтинг:
12

Sergey Alexandrovich Kryukov

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

enum Information {
   NAME = 0,
   ADDRESS,
   BIRTHDATE,
   Length,
};

//...

for (int index = NAME; index < Length; ++index) {
   // use index as 
}


—СА


Resmi Anna

Почему мы должны идти на это?
int NumberOfElm = длина - имя;
хватит РТ?
что делать, если перечисление выглядит так
перечисление информации {
Имя = 0,
АДРЕС,
Дата рождения = 100,
Длина,
};
кроме того, я чувствую, что этот вопрос не имеет никакого смысла, как количество элементов в массиве или списке. потому что я никогда не слышал ни о чем подобном динамическому перечислению в c++. есть ли что-нибудь подобное??

Niklas L

ИМО довольно ясно, что ОП не имеет даты рождения = 100. Динамические перечисления не являются динамическими во время выполнения, а скорее во время эволюции программного обеспечения. Я могу вспомнить несколько ситуаций, когда это может пригодиться. Невозможность определить количество элементов в перечислимой последовательности является серьезным ограничением.

Resmi Anna

какую роль играет количество элементов в enum?Его значение важно rt?
извините, если я ошибаюсь.
любая реальная ситуация, которая нуждается в количестве elemnts в enum?

Niklas L

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

Resmi Anna

Не здесь для спора:):)..просто чтобы поделиться своими взглядами.

Колода карт - классический пример использования перечисления.

Я спрашиваю, есть ли какой-то момент, когда нам нужно знать количество элементов в перечислении динамически?

например, предположим, что у нас есть массив символов в нашей программе char str[50];

На момент исполнения 1 может содержать строку"Привет"

В точке выполнения 2 он может содержать строку"Hello"

таким образом, мы должны иметь некоторую функцию, чтобы знать длину массива.

правильно до сих пор??

предположим, что Ваш массив содержит значение "Hi" во время выполнения программы.Если вы совершенно уверены в этом, вы можете использовать

const int Lenth = 2;

Нет необходимости писать функцию GetLenght ().Это только добавит хит производительности.

предположим, что ваш Привет становится "привет" в вашей версии программного обеспечения 2.

затем вы можете изменить const int Lenth = 5.

здесь также мы рассматриваем производительность, чем избегание однострочного codeagreeing??

итак, есть ли вероятность, что в точке выполнения 1 ваше перечисление содержит 4 элемента, а в точке выполнения 2 перечисление содержит 5 элементов?Тогда только вам нужно беспокоиться о вычислениях

количество элементов перечисления rt?кто-то понял:(:(?????

Niklas L

Я понимаю вашу точку зрения, и технически вы правы. Я говорю, что отсутствие языковой поддержки этой информации является источником ошибок. Если вы добавляете новое значение в свою последовательность перечислений, вам также придется обновить другое значение где-то еще, длину const int в вашем случае. Вы можете ввести очень трудно поймать ошибки, если вы забудете об этом. Это вопрос технического обслуживания. Вот тут-то и пригодятся подобные конструкции. Это далеко не идеальное решение, по приведенным причинам, но оно работает довольно хорошо и является обычной практикой в C/C++.

Sergey Alexandrovich Kryukov

Я полностью согласен. Это типичный обман C++ в отношении перечисления. В языках с реальным перечислением (Ada, Pascal) у вас есть все это. С C++ простая техника SP 24 или I show является практически лучшей. Это накладывает ограничения и требует дисциплины, но что еще можно сделать?
--СА

Sergey Alexandrovich Kryukov

Конечно, вы правы. Все проблемы, которые мы обсуждаем здесь, - это наследие C/C++ типа enum, который не является "реальным" типом перечисления.
Все подробности в моей статье "Типы перечисления не перечисляются!":
http://www.codeproject.com/KB/dotnet/EnumTypesDoNotEnumerate.aspx
--СА

Sergey Alexandrovich Kryukov

Правда, но Анна в целом права. Все варианты таких техник страдают ограниченностью. Пожалуйста, смотрите мой комментарий ниже и мою статью на эту тему. Это C#, но наследие C обсуждается.
--СА

Albert Holguin

это предназначено для поддержки лучшей эволюции программного обеспечения, как предположил Никлас, например, если в будущем вы добавите два перечисляемых значения, любые циклы или операторы case, которые используют MIN и MAX, не должны будут изменяться, они уже будут функциональны после добавления новых элементов

Sergey Alexandrovich Kryukov

Хорошее внимание. Да, это главный момент об этом.
--СА

Legor

Я согласен с этим решением. Вам понадобится некоторая длина или МАКС в качестве последнего компонента вашего перечисления, чтобы определить количество элементов. Учитывая, что цифры являются простыми 1-инкрементами.

Sergey Alexandrovich Kryukov

Большое спасибо.
Пожалуйста, смотрите мои комментарии выше и мою статью.
--СА

Рейтинг:
1

Emilio Garavaglia

Так, как вы просили ... НЕТ.
Нет никакой функции (кода, который должен быть выполнен), которая могла бы дать такой результат, так как стандартный C++ имеет никакого отражения.
Стандартный RTTI адаптирован для поддержки dynamic_cast и не имеет никакой роли в перечислениях.

Все может быть иначе, если мы рассмотрим некоторые языковые расширения (например, C++/CLI, то есть стандарт ECMA, не принятый ANSI, который является владельцем стандарта C++...), которые могут добавить отражение и, следовательно, возможность запрашивать во время выполнения состояние источника.

Конечно, могут быть такие трюки, как

enum E
{
    a,b,c, count;
};

Это приводит к a=0, b=1, c=2, count=3. Но это совсем другое дело по отношению к тому, что вы спросили (может быть, недостаточно для определенной цели).


Рейтинг:
1

Ankesh Gamit

Перечисление.GetNames(typeof(INFORMATION)).Рассчитывать()


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


Maciej Los

Мой голос-1. Это не код C++!
Версия C++ немного отличается. Видеть: Перечисление.Метод GetNames(Type) (System) | Microsoft Docs[^]

Рейтинг:
0

ShilpiP

Учитывая структуру, которую вы даете, это:

typedef enum
{
MIN = 0,
NAME  = MIN,
ADDRESS,
BIRTHDATE,
MAX = BIRTHDATE
};
int NumOfElement = MAX-MIN+1;


Или непосредственно дата рождения + 1 (если перечисление начинается с 0).


Sergey Alexandrovich Kryukov

Это улучшенный вариант того, что я предложил, мой 5.
Все проблемы, которые мы обсуждаем здесь, - это наследие C/C++ типа enum, который не является "реальным" типом перечисления. Все подробности в моей статье "Типы перечисления не перечисляются!":
http://www.codeproject.com/KB/dotnet/EnumTypesDoNotEnumerate.aspx

--СА

ShilpiP

Спасибо за 5. Я не знал о вашем разговоре. Сейчас проверю.

CPallini

Я бы предпочел NAME=0, MIN=NAME.

Рейтинг:
0

ThatsAlok

Я согласен с SA, однако, занимаясь общим программированием и думая о будущей расширяемости, мы всегда добавляем eENUMLast в enum, так что если мы добавляем/удаляем любое перечисляемое значение, eENUMLast всегда остается последним.