いくつかの算術演算、たとえば固定小数点計算をカプセル化するクラスがあります。算術演算子をオーバーロードするというアイデアが好きなので、次のように記述します。
class CFixed
{
CFixed( int );
CFixed( float );
};
CFixed operator* ( const CFixed& a, const CFixed& b )
{ ... }
それはすべて機能します。3 * CFixed(0)とCFixed(3)*10.0fと書くことができます。しかし、今では、整数オペランドを使用した演算子*をはるかに効果的に実装できることに気付きました。だから私はそれをオーバーロードします:
CFixed operator* ( const CFixed& a, int b )
{ ... }
CFixed operator* ( int a, const CFixed& b )
{ ... }
それでも機能しますが、CFixed(0)* 10.0fはオーバーロードされたバージョンを呼び出し、floatをintに変換します(floatをCFixedに変換することを期待していました)。もちろん、floatバージョンをオーバーロードすることもできますが、私にとってはコードの組み合わせ爆発のようです。回避策はありますか(またはクラスの設計が間違っていますか)?オーバーロードされたバージョンのoperator*をintのみで呼び出すようにコンパイラに指示するにはどうすればよいですか?