在C ++中使用typedef获得更多类型安全

TSL_

我想重温这个职位当前,我试图避免在程序中混合角度的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;
}
丹尼尔·H

您所拥有的一切根本无助于键入安全性,除非是薄弱的文档。至于编译器而言,floatDegree,和Radian齐全的同义词; 这称为弱类型别名。强类型别名不是C ++的一部分,但是您可以解决此问题。关于这方面的两篇好文章在这里这里基本思想是为强类型定义创建通用类模板,并使用该模板创建每个单独的别名。

如果您不想自己编写所有样板文件,建议您使用第三方库来处理。我上面链接的帖子的两位作者都为此编写了库NamedTypetype_safe如果您需要重型产品,请查看Boost.Units请注意,我本人并没有使用过这些。它们只是我检查是否需要这些功能的地方。

您没有问这个问题,但是与仅float在任何地方使用和手动跟踪单位无关,这都不会有任何运行时性能成本,但可能会使编译速度变慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章