2014-11-13 6 views
0

Можно ли сделать следующее на C++ 11?Можно создать тип перечисления во время выполнения?

int NED = 3; 

или более вероятно,

struct EnumMembers 
{ 
    std::string name; 
}; 


list<EnumMembers> countries = readafileOfMembers(); 

say countries list contains "USA", "NOR"; 

enum CountryType 
{ 
}; 

for(auto& c : countries) 
{ 
    CountryType.Add(c); //since USA first added = 0 
} 

или я могу сказать:

CountryType.Add(NED); 

CountryType c = CountryType::USA; 

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

+0

вы можете создать структуру, которая модель является целым числом, но делают дополнительные валидации домена под ним. Раньше я этого не видел. (в C++), стандартизованный – sehe

+0

C++ - это статически типизированный скомпилированный язык. Вы не можете этого делать. Ближе всего вы можете использовать карту для поиска целочисленных значений из строковых ключей. – dtech

ответ

0

Что именно вы ищете, зависит от его использования. Но это не перечислить. Вам необходимы динамическая структура данных, как std::map или std::unordered_map, может быть std::set вы можете найти, например, обычаи std::set, например:

enum class Countries 
{ 
    USA =0, 
    Canada =1 
}; 


std::set<Countries> countries; 
countries.insert(Countries::USA); 
countreis.insert(Countries::Canada); 

Или вы можете использовать unordered_map, когда целое значение должно быть связанно страной ...

+0

Нет, это не то, что я хочу. Либо я не очень хорошо объяснял это, либо не понимал, о чем я прошу. std :: set стран не добавляет дополнительной стоимости по уже созданным странам перечисления. Перечисление добавляет безопасность типа по int. Я хочу иметь возможность создавать тип перечисления во время выполнения, чтобы члены не были известны во время компиляции, и я хочу семантику перечисления. – Ivan

0

Из вашего вопроса и вашего комментария я понимаю ваши требования следующим образом:

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

В статически типизированных языках, как C++, где все проверки типа происходит во время компиляции эти два требования являются взаимоисключающими. (Сравните это с динамически типизированным языком, где такой подход будет осуществим).

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

class Country { 
    Country (int numericRepresentation) 
    : numericRepresentation(numericRepresentation) 
    { 
     // setOfLegalInputs could be static 
     if(!setOfLegalInputs.contains(numericRepresentation) 
     { 
      throw TypeError("No such country exists"); 
     } 
    } 

    // ... 
} 
Смежные вопросы