是否有可用于转换单位的 C++ 预处理器指令或类似指令
Is there a C++ preprocessor directive or similar that I can use to convert units
我正在做一些电机控制,而不是说 39553 编码器刻度,我的大脑说 6.5 英寸会更容易。我想通过在编译时转换它来节省处理器开销。有没有办法用预处理器指令或模板来做到这一点?谢谢。
我会为此使用 constexpr
。正如@ChrisMM 提到的,它不是预处理器,但它将在编译时而不是 运行 时进行评估。如果你给出的值对应实际刻度和英寸的关系,你可以使用:
constexpr int toTicks(double inches) {
return int(6085 * inches);
}
通过对 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);
通过使用 cm per ticks 而不是 ticks per cm 我们可以去掉除法,但是你不能去掉任何乘法。
我正在做一些电机控制,而不是说 39553 编码器刻度,我的大脑说 6.5 英寸会更容易。我想通过在编译时转换它来节省处理器开销。有没有办法用预处理器指令或模板来做到这一点?谢谢。
我会为此使用 constexpr
。正如@ChrisMM 提到的,它不是预处理器,但它将在编译时而不是 运行 时进行评估。如果你给出的值对应实际刻度和英寸的关系,你可以使用:
constexpr int toTicks(double inches) {
return int(6085 * inches);
}
通过对 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);
通过使用 cm per ticks 而不是 ticks per cm 我们可以去掉除法,但是你不能去掉任何乘法。