我想重温这个职位。当前,我试图避免在程序中混合角度的Rad和度类型而产生的错误。
例如:
typedef float Degree;
typedef float Radian;
Degree a = 15.;
Radian b = 3.14/4.;
float c = a + b; // no compile error
是否有新的更新解决方案?
编辑01:
我希望编写自己的类,希望它的规模小并且没有依赖性。这是工作代码
#include <stdio.h>
#include <iostream>
template<typename numT>
class RadAngle {
public:
RadAngle() {
AngVal = 0.0;
}
RadAngle(const numT& angV) {
AngVal = angV;
}
void operator = (const RadAngle<numT>& ang1) {
AngVal = ang1.getVal();
}
RadAngle operator+(const RadAngle<numT>& ang1) const { return RadAngle<numT>(AngVal+ang1.getVal()); }
RadAngle operator-(const RadAngle<numT>& ang1) const { return RadAngle<numT>(AngVal-ang1.getVal()); }
RadAngle operator*(const RadAngle<numT>& ang1) const { return RadAngle<numT>(AngVal*ang1.getVal()); }
RadAngle operator/(const RadAngle<numT>& ang1) const { return RadAngle<numT>(AngVal/ang1.getVal()); }
numT getVal() const { return AngVal;};
private:
numT AngVal;
};
int main() {
RadAngle<float> a(1.5);
RadAngle<float> b(3.14);
RadAngle<float> c = a+b;
//std::cout << c << std::endl;
// printf("%.2f",c.getVal());
return 0;
}
您所拥有的一切根本无助于键入安全性,除非是薄弱的文档。至于编译器而言,float
,Degree
,和Radian
齐全的同义词; 这称为弱类型别名。强类型别名不是C ++的一部分,但是您可以解决此问题。关于这方面的两篇好文章在这里和这里。基本思想是为强类型定义创建通用类模板,并使用该模板创建每个单独的别名。
如果您不想自己编写所有样板文件,建议您使用第三方库来处理。我上面链接的帖子的两位作者都为此编写了库NamedType和type_safe。如果您需要重型产品,请查看Boost.Units。请注意,我本人并没有使用过这些。它们只是我检查是否需要这些功能的地方。
您没有问这个问题,但是与仅float
在任何地方使用和手动跟踪单位无关,这都不会有任何运行时性能成本,但可能会使编译速度变慢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句