我有一个想法是由我在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类中手动实现所有这些操作了?