2014-10-22 38 views
2

我正在写一个简单的转换程序,我想创造一些与此类似:有没有办法为非整数创建枚举数据类型?

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

有一个简单的数据结构,让我来组织这样的数据?

+3

既然你已经尝试写可读的程序(这是值得称道的),为什么不走一路和使用['的std :: ratio'] (http://en.cppreference.com/w/cpp/numeric/ratio/ratio)用于无量纲比率和用于维度的单独单位系统? – 2014-10-22 08:24:13

+2

@KerrekSB别忘了[Boost.Units](http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units.html)。 – Angew 2014-10-22 08:25:04

+0

@Mario对不起复制/粘贴:)这是正确的:http://stackoverflow.com/questions/19408305/c-floating-point-enum – manlio 2014-10-22 08:52:59

回答

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; 
0

有一个简单的数据结构...

并不是这么简单,你想与Unit_Type做什么。您当然可以创建一个Units_Of_Distance类和一些const实例,称为centimetre,metre,kilometre等 - 将您的号码传递给构造函数。

如果你不喜欢从头开始编写类似的东西,或者想更强大的东西,Kerrek和Angew的评论是好引线....

相关问题