Есть ли директива препроцессора C ++ или аналогичная, которую я могу использовать для преобразования единиц - PullRequest
0 голосов
/ 30 мая 2020

Я немного управляю моторикой, и вместо того, чтобы произносить 39553 тика энкодера, моему человеческому мозгу было бы легче сказать 6,5 дюйма. Я хотел бы сократить накладные расходы процессора, преобразовав это во время компиляции. Есть ли способ сделать это с помощью директив препроцессора или шаблонов? Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2020

Вы можете использовать определенные пользователем литералы. Например, вот реализация для сантиметров в единицу измерения:

struct meter {
    double value;
};

constexpr auto operator"" _cm(double cm) -> meter
{
    return meter{cm / 100.0};
}

constexpr auto operator"" _mm(double mm) -> meter
{
    return meter{mm / 1000.0};
}

Затем используйте это так:

auto length1 = 50_cm;
auto length2 = 500_mm;

std::cout << length1.value + length2.value; // prints 1
0 голосов
/ 01 июня 2020

Я бы просто использовал #defines:

#define CM_PER_TICK    0.01
#define toTicks(a)   (a * CM_PER_TICK)

move(toTicks(6.5));

Это сводится к

move(6.5 * 0.01);

Используя см на такты вместо тактов на см, мы можем избавиться от деления , но вы не сможете избавиться от умножения.

0 голосов
/ 30 мая 2020

Я бы использовал для этого constexpr. Как упоминалось в @ChrisMM, это не препроцессор, но он будет оцениваться во время компиляции, а не во время выполнения. Если значения, которые вы указали, соответствуют фактическому соотношению между отметками и дюймами, вы можете использовать:

constexpr int toTicks(double inches) {
    return int(6085 * inches);
}

Выполняя приведение к int, вы можете быть уверены, что никогда не просите двигатель сдвинуть какой-то доля клеща. Единственное, с чем следует быть осторожным при таком подходе, это то, что со временем, если вы попросите двигатель переместиться в кучу разных мест без возврата в исходную точку между каждым перемещением, ваша исходная точка может медленно смещаться с ошибками округления от преобразования к внутр.

...