假设有两种类型:
typedef unsigned short Altitude;
typedef double Time;
要检测一些错误,例如在编译时将高度位置的时间参数传递给函数,我想禁止从Altitude
到Time
的隐式转换,反之亦然。
我首先尝试的是声明operator Altitude(Time)
没有实现,但编译器说它必须是一个成员函数,所以我理解它不适用于typedef
ed类型。
接下来我尝试将其中一种类型转换为一个类,但似乎该项目广泛使用了大量算法,包括对double
,int
,bool
等的隐式转换。,以及通过operator<<
和operator>>
将它们传入和传输到流中。所以尽管这种方式允许我找到我正在寻找的错误,但我甚至没有尝试完全实现兼容类,因为它需要大量的代码。
所以我的问题是:是否有一种更优雅的方法来防止两种特定typedef
ed类型之间的隐式转换,如果是,那么如何?
答案 0 :(得分:3)
typedef
只会为现有类型建立另一个名称。
因此,您的问题归结为您是否可以禁用unsigned short
和double
之间的隐式转换,这通常是不可能的。
有两种方法可以解决这个问题:
首先,您可以将Altitude
和Time
设置为自己的类型(读取:定义class
而不是typedef
s)并确保它们可以轻松转换来往于他们的基础数字类型 - 但不是彼此。
其次,您可以确保您所做的任何事情都受到语言结构的保护,例如:如果你有一个f
函数应该Altitude
又名unsigned short
,你可以用另一个函数f
重载它,它需要Time
aka {{1}并导致错误。这提供了更好的重载匹配,因此在这种情况下会阻止隐式转换。