C++模板滥用问题 - 使用其他类型信息扩充浮动

Vol*_*ire 1 c++ templates

我有一个想法是由我在boost MTL库的教程中阅读的一些文档激发的.

基本前提是我想使用模板为我提供编译时类型检查错误,否则它们是相同的.

也就是说,假设我有两个测量单位,即Radians和Degrees.获得类型安全最明显的方法是定义2个类:

struct Radian
{
  float rad;
}

struct Degree
{
  float deg;
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除了我可以做的事情

func()
{
  Radian r;
  Degree d;

  r.rad = d.deg;
}
Run Code Online (Sandbox Code Playgroud)

如果我可以将这样的赋值标记为编译时类型错误,那将是很好的.这引导我考虑以下内容:

struct Degree {};
struct Radian {};

template <class Data, class Unit>
struct Quantity
{
    Data val;

    Quantity<Data,Unit>() : val() {}
    explicit Quantity<Data,Unit>(Data v) : val(v) {}
};

typedef Quantity<float,Radian> Rad;
typedef Quantity<float,Degree> Deg;
Run Code Online (Sandbox Code Playgroud)

现在,使用Rad和Deg类型的func()的等效代码会将该赋值标记为编译时错误(并且使用显式设置,即使执行像Rad r = 2.0这样简单的操作也被视为编译时错误).

我真正想要的是一个具有这个额外单位属性的浮点数,可用于在编译时捕获逻辑错误(即,在函数中使用度数期望弧度),但是对于所有意图和目的,这些都是浮点数.

作为一般性问题,您对此方法有何看法?我有点担心这是实现我的目标的错误方法,但它有一个奇怪的吸引力.此外,是否有一个"特征"或像升级概念检查,我可以用来确定数据是"漂浮像".最后,有没有什么方法可以继承默认的操作实现,比如"<<",这样我就不必在Quantity类中手动实现所有这些操作了?

rlb*_*ond 6

我相信你正在寻找像Boost.Units这样的东西.我认为这是一个开始的地方.