Как определить, определено ли определенное значение в типе перечисления в C ++?

Мне нужно проверить, определены ли некоторые значения в типе enum или нет во время выполнения в C ++. Требование может быть легко выполнено с помощью C # (см. Следующий код). Но C ++ не имеет информации о типе во время выполнения (насколько я знаю). Есть ли способ обойти это?

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

enum BoFormObjectEnum
{
fo_Items = 4,
fo_SalesEmployee = 53,
fo_TransactionTemplates = 55,
fo_JournalPosting = 30,
fo_CheckForPayment = 57,
fo_PaymentTermsTypes = 40,
...
}

class Program
{
static void Main(string[] args)
{
var array = Enumerable.Range(1, 60);
foreach (var item in array)
{
if (Enum.IsDefined(typeof(BoFormObjectEnum), item))
// do some logic
else
// do some other logic
}
}
}

1

Решение

C ++ не предоставляет то, что вы хотите.

Самое «правильное» решение — это полностью изменить дизайн, а не использовать перечисление C ++, как это. Это не то же самое, что C # enum, они настолько различны, что вы не должны думать о них как об одном и том же, так же как и объединения и enum — это одно и то же. Очистите свой разум от решения C #, разработайте решение C ++.

Проще всего, особенно если значения перечислений не часто меняются (и если они меняются, почему они являются жестко запрограммированными перечислениями?), Это просто «укусить маркер» и создать набор или карту с допустимыми значениями, и когда вы хотите чтобы узнать, определено ли какое-либо число как enum, проверить, есть ли оно в наборе, или если вам также нужно имя, тогда используйте map, чтобы вы могли включить и значение в виде int, и имя в виде строки.

0

Другие решения

То, что вы ищете, называется отражение, C ++ не предоставляет эту функцию, однако есть несколько статей об этом.

Также новый стандарт C ++ 11 вводит что-то новое о перечислениях делая их намного более безопасными по типу, а не просто случайной величиной со значением.

0

Существует обходной путь, но его многословный, как он приходит в виде повышение :: фьюжн. Эта библиотека получила свое название от своей цели быть гибридом чистой библиотеки метапрограммирования шаблонов времени компиляции повышение :: MPL и время выполнения Стандартная библиотека шаблонов.

boost :: fusion позволяет вектору или карте инициализироваться и использоваться во время компиляции, а также использоваться во время выполнения.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector