问题同上,详情如下:
我有一个类 Money
来处理......好吧,你猜对了。我对不允许Money
和double
交互(*)非常严格,所以下面的代码不可能:
Money m1( 4.50 );
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
现在我正在考虑允许 Money
与 int
相乘,例如“你有 6 block 蛋糕,每 block 4.50 美元(所以去哪里找更便宜的蛋糕吧) )。”
class Money
{
Money();
Money( const Money & other );
explicit Money( double d );
...
Money & operator*=( int i );
...
}
inline const Money operator*( const Money & m, int i ) { return Money( m ) *= i; }
inline const Money operator*( int i, const Money & m ) { return Money( m ) *= i; }
效果很好,但是...
不幸的是,C++ 将 implicit casts 从 double
转换为 int
,所以突然间我的第一个代码片段将编译。我不想要那个。在这种情况下有什么方法可以防止隐式强制转换?
谢谢! -- 罗宾
(*) 原因:我有很多遗留代码可以用 double
处理所有与 Money
相关的东西,我不希望这些类型混淆,直到一切都运行用钱
。
编辑:为 Money 添加了构造函数。
编辑:谢谢大家的回答。几乎所有人都很棒而且乐于助人。 R. Martinho Fernandes 的评论“你可以做 inline const Money operator*( const Money & m, double d ) = delete;
”实际上是答案(一旦我切换到 C++ 11-支持编译器)。 Kerrek SB 提供了一个不错的非 C++11 替代方案,但我最终使用的是 Nicola Musatti 的“重载 long
”方法。这就是为什么我将他的答案标记为“答案”(也因为所有有用的想法都是对他的答案的评论)。再次感谢!
最佳答案
模板加上编译时特征检查怎么样:
#include <type_traits>
// ...
template <typename T>
Money & operator*=(const T & n)
{
static_assert(std::is_integral<T>::value, "Error: can only multiply money by integral amounts!");
// ...
}
关于c++ - 如何防止隐式强制转换 double -> int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903083/