Есть ли способ создать перечисляемый тип данных для нецелых?

Я пишу простую программу преобразования, и я хотел бы создать что-то похожее на это:

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

Существует ли простая структура данных, которая позволит мне организовать мои данные следующим образом?

2

Решение

На самом деле, нет. В то время как 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;
0

Другие решения

Есть ли простая структура данных …

Не так просто, как то, что вы хотели бы сделать с Unit_Type, Вы можете, конечно, создать Units_Of_Distance класс и некоторые const экземпляры называются centimetre, metre, kilometre и т. д. — передача ваших номеров конструктору.

Если вам не хочется писать что-то подобное с нуля, или вы хотите что-то более мощное, комментарии Керрека и Энджу — это хорошее руководство …

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector