我正在做一些电动机控制,而不是说39553个编码器滴答声,对我的大脑来说,说6.5英寸会更容易。我想通过在编译时进行转换来节省处理器开销。有没有办法用预处理指令或模板来做到这一点?谢谢。
我将为此使用constexpr
。正如@ChrisMM所提到的,它不是预处理器,但是它将在编译时而不是运行时进行评估。如果您提供的值与刻度和英寸之间的实际关系相对应,则可以使用:
constexpr int toTicks(double inches) {
return int(6085 * inches);
}
通过对int进行转换,可以确保您永远不会要求电动机移动刻度线的一部分。唯一需要注意的是,随着时间的流逝,如果您要求电动机移动到一堆不同的位置而又不返回原点,则每次移动都会使原点缓慢地发生舍入误差,从转换到int。
您可以使用用户定义的文字。例如,以下是厘米到米的实现:
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
我只用#defines:
#define CM_PER_TICK 0.01
#define toTicks(a) (a * CM_PER_TICK)
move(toTicks(6.5));
这可以归结为
move(6.5 * 0.01);
通过使用每刻度厘米数而不是每厘米刻度数,我们可以摆脱除法,但您将无法摆脱任何乘法。