Я пишу простую программу преобразования, и я хотел бы создать что-то похожее на это:
//Ratios of a meter
enum Unit_Type
{
CENTIMETER = 0.01, //only integers allowed
METER = 1,
KILOMETER = 1000
};
Существует ли простая структура данных, которая позволит мне организовать мои данные следующим образом?
На самом деле, нет. В то время как C ++ 11 вводит некоторые действительно аккуратные новые вещи для перечислений, например в частности, возможность назначить им какой-то конкретный внутренний тип данных (например, 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 пользовательские литералы может быть что-то для вас:
constexpr float operator"" _cm(float units) {
return units * .01f;
}
Это может быть использовано следующим образом:
float distance = 150_cm;
Есть ли простая структура данных …
Не так просто, как то, что вы хотели бы сделать с Unit_Type
, Вы можете, конечно, создать Units_Of_Distance
класс и некоторые const
экземпляры называются centimetre
, metre
, kilometre
и т. д. — передача ваших номеров конструктору.
Если вам не хочется писать что-то подобное с нуля, или вы хотите что-то более мощное, комментарии Керрека и Энджу — это хорошее руководство …