可以在运行时创建枚举类型吗?

时间:2014-11-13 15:59:18

标签: c++11 boost dynamic

是否可以在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;

本质上,enum是一个必须在编译时填充的容器。我想要一个可以在运行时动态填充的枚举。 也许我并不是真的在寻找一个枚举,而是一个充满枚举的动态类型。

2 个答案:

答案 0 :(得分:0)

您在寻找什么取决于它的用法。但它并不是肯定的。您需要动态数据结构为std::mapstd::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

答案 1 :(得分:0)

根据您的问题和评论,我理解您的要求如下:

  • 您需要通过限制合法值的范围来强加额外的类型安全
  • 您想在运行时确定合法值的范围

在像c ++这样的静态类型语言中,所有类型检查都在编译时发生,这两个要求是互斥的。 (将其与动态类型语言进行比较,这种方法可行)。

但是,请注意,即使使用动态类型,您可以实现的最佳效果是不变量的运行时验证(例如,在python中,您将获得TypeError异常)。您可以通过将国家/地区存储在Bartosz提出的动态数据结构中并按如下方式创建自定义类来显然模仿这种行为:

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

   // ...
}