我正在写一个简单的转换程序,我想创造一些与此类似:有没有办法为非整数创建枚举数据类型?
//Ratios of a meter
enum Unit_Type
{
CENTIMETER = 0.01, //only integers allowed
METER = 1,
KILOMETER = 1000
};
有一个简单的数据结构,让我来组织这样的数据?
我正在写一个简单的转换程序,我想创造一些与此类似:有没有办法为非整数创建枚举数据类型?
//Ratios of a meter
enum Unit_Type
{
CENTIMETER = 0.01, //only integers allowed
METER = 1,
KILOMETER = 1000
};
有一个简单的数据结构,让我来组织这样的数据?
不是真的。虽然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;
有一个简单的数据结构...
并不是这么简单,你想与Unit_Type
做什么。您当然可以创建一个Units_Of_Distance
类和一些const
实例,称为centimetre
,metre
,kilometre
等 - 将您的号码传递给构造函数。
如果你不喜欢从头开始编写类似的东西,或者想更强大的东西,Kerrek和Angew的评论是好引线....
既然你已经尝试写可读的程序(这是值得称道的),为什么不走一路和使用['的std :: ratio'] (http://en.cppreference.com/w/cpp/numeric/ratio/ratio)用于无量纲比率和用于维度的单独单位系统? – 2014-10-22 08:24:13
@KerrekSB别忘了[Boost.Units](http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units.html)。 – Angew 2014-10-22 08:25:04
@Mario对不起复制/粘贴:)这是正确的:http://stackoverflow.com/questions/19408305/c-floating-point-enum – manlio 2014-10-22 08:52:59