有没有办法为非整数创建枚举数据类型?

时间:2014-10-22 08:19:43

标签: c++ data-structures types enumerated-types

我正在编写一个简单的转换程序,我想创建类似于此的东西:

//Ratios of a meter
enum Unit_Type
{
  CENTIMETER = 0.01, //only integers allowed
  METER = 1,
  KILOMETER = 1000
};

是否有一个简单的数据结构可以让我像这样组织我的数据?

2 个答案:

答案 0 :(得分:0)

  

是否有简单的数据结构......

不像您想要对Unit_Type那样简单。您当然可以创建Units_Of_Distance类和一些名为constcentimetremetre的{​​{1}}个实例。 - 将您的数字传递给构造函数。

如果你不想从头开始写这样的东西,或者想要一些更强大的东西,那么Kerrek和Angew的评论就是好的领导......

答案 1 :(得分:0)

不是真的。虽然C ++ 11引入了一些really neat new things for enums,例如特别是能够为它们分配一些特定的内部数据类型(如char),没有办法添加浮点数或任何其他非整数类型。

根据您实际尝试的内容,我会使用一些简单的旧结构:

struct UnitInfo {
    const char *name;
    float       ratio;
};

UnitInfo units[] = {
    {"centimeter",   0.01f},
    {"meter",        1},
    {"kilometer", 1000},
    {0, 0} // special "terminator"
};

然后,您可以使用指针作为迭代器迭代所有可用单位:

float in;
std::cout << "Length in meters: ";
std::cin >> in;

// Iterate over all available units
for (UnitInfo *p = units; *p; ++p) {
    // Use the unit information:
    //  p[0] is the unit name
    //  p[1] is the conversion ratio
    std::cout << (in / p[1]) << " " << p[0] << std::endl;
}

如果这是将这些比率与实际值(如100 * CENTIMETER)一起使用,那么C ++ 11的user-defined literals可能适合您:

constexpr float operator"" _cm(float units) {
    return units * .01f;
}

然后可以这样使用:

float distance = 150_cm;