如何限制typedef类型的隐式转换?

时间:2014-04-24 15:11:08

标签: c++ type-conversion implicit-conversion

假设有两种类型:

typedef unsigned short Altitude;
typedef double Time;

要检测一些错误,例如在编译时将高度位置的时间参数传递给函数,我想禁止从AltitudeTime的隐式转换,反之亦然。

我首先尝试的是声明operator Altitude(Time)没有实现,但编译器说它必须是一个成员函数,所以我理解它不适用于typedef ed类型。

接下来我尝试将其中一种类型转换为一个类,但似乎该项目广泛使用了大量算法,包括对doubleintbool等的隐式转换。,以及通过operator<<operator>>将它们传入和传输到流中。所以尽管这种方式允许我找到我正在寻找的错误,但我甚至没有尝试完全实现兼容类,因为它需要大量的代码。

所以我的问题是:是否有一种更优雅的方法来防止两种特定typedef ed类型之间的隐式转换,如果是,那么如何?

1 个答案:

答案 0 :(得分:3)

typedef只会为现有类型建立另一个名称。

因此,您的问题归结为您是否可以禁用unsigned shortdouble之间的隐式转换,这通常是不可能的。

有两种方法可以解决这个问题:

首先,您可以将AltitudeTime设置为自己的类型(读取:定义class而不是typedef s)并确保它们可以轻松转换来往于他们的基础数字类型 - 但不是彼此。

其次,您可以确保您所做的任何事情都受到语言结构的保护,例如:如果你有一个f函数应该Altitude又名unsigned short,你可以用另一个函数f重载它,它需要Time aka {{1}并导致错误。这提供了更好的重载匹配,因此在这种情况下会阻止隐式转换。