Вопрос, как указано выше, более подробно ниже:
У меня есть класс Money
для решения... ну, вы догадались, что. Я очень строг в том, что не позволяю Money
и double
взаимодействовать (*), поэтому следующий код не:
Money m1( 4.50 );
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Теперь я думаю о разрешении умножения Money
на int
, как в "у вас есть 6 кусочков торта за 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; }
Это прекрасно работает, , но.
К сожалению, С++ делает неявные отбрасывания от double
до int
, поэтому мой первый фрагмент кода будет скомпилирован. Я не хочу этого. Есть ли способ предотвратить неявные приведения в этой ситуации?
Спасибо! - Робин
(*) Причина: у меня много устаревшего кода, который обрабатывает все Money
-связанные вещи с помощью double
, и я не хочу, чтобы эти типы путались до тех пор, пока все не будет запущено с Money
.
Изменить: добавлены конструкторы для денег.
Изменить: Спасибо, всем, за ваши ответы. Почти все они были большими и полезными. Комментарий R. Martinho Fernandes "вы можете сделать inline const Money operator*( const Money & m, double d ) = delete;
" на самом деле был ответом (как только я переключусь на поддерживающий С++ 11 компилятор). Kerrek SB дал хорошую альтернативу не-С++ 11, но то, что я в конечном итоге использовал, - это подход Николаса Мусатти "перегрузка long
". Вот почему я отмечаю его ответ как "ответ" (также потому, что все полезные идеи появились в виде комментариев к его ответу). Еще раз спасибо!