c++ - 如何防止隐式强制转换 double -> int?

标签 c++ casting

问题同上,详情如下:

我有一个类 Money 来处理......好吧,你猜对了。我对不允许Moneydouble交互(*)非常严格,所以下面的代码不可能:

Money m1( 4.50 );
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error

现在我正在考虑允许 Moneyint 相乘,例如“你有 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 castsdouble 转换为 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/

相关文章:

C++ 类型转换数组

来自文字 Splint 的 C 字符警告不兼容的类型

c# casting 问题

android - 适用于 Android 的 C++ Builder WSDL 客户端

c++ - 在复制构造函数中设置嵌套在类中的结构变量

c++ - 你能改变 Qt 连接的队列大小吗?

java - JAVA 中的内部转换是如何工作的?原始和引用转换

c++ - C stdlib/stdio 的阴影函数

c++ - GCC 的 std::sort 与 lambda 的不稳定行为

ios - 将项目转换到两个选项之一