#include <stdio.h>
#define USE_CAST_OP
class Float;
class Double
{
double m_Value;
public:
Double() : m_Value( 0.0 ){}
explicit Double( double d ) : m_Value( d ){}
#ifdef USE_CAST_OP
explicit
#endif
Double( const Float& f );
double GetValue( void ) const { return m_Value; }
Double operator +( const Double& other ){ printf( "Double::operator+(Double)\n" ); return Double( m_Value + other.m_Value ); }
#ifdef USE_CAST_OP
operator Float();
#endif
};
class Float
{
float m_Value;
public:
Float() : m_Value( 0.0f ){}
explicit Float( float f ) : m_Value( f ){}
#ifdef USE_CAST_OP
explicit
#endif
Float( const Double& d ) : m_Value( d.GetValue() ){}
float GetValue( void ) const { return m_Value; }
Float operator +( const Float& other ){ printf( "Float::operator+(Float)\n" ); return Float( m_Value + other.m_Value ); }
Double operator +( const Double& other ){ printf( "Float::operator+(Double)\n" ); return Double( m_Value + other.GetValue() ); }
#ifdef USE_CAST_OP
operator Double(){ printf( "Float to Double\n" ); return Double(); }
#endif
};
Double::Double( const Float& f ) : m_Value( f.GetValue() ){}
#ifdef USE_CAST_OP
Double::operator Float(){ printf( "Double to Float\n" ); return Float(); }
#endif
// Double operator +( Double left, Double right ){ printf( "::operator+(Double,Double)\n" ); return Double(); }
void PrintType( const Double& d ){ printf( "Result : Double\n" ); }
void PrintType( const Float& f ){ printf( "Result : Float\n" ); }
void RequireFloat( const Float& f ){ }
void RequireDouble( const Double& d ){ }
int main( void )
{
Double d;
Float f;
printf( "[0]\n" );
PrintType( f + f );
printf( "[1]\n" );
PrintType( d + d );
printf( "[2]\n" );
PrintType( d + f ); // fはDoubleへ暗黙の型変換が発生する。
printf( "[3]\n" );
PrintType( f + d ); // fはDoubleへ暗黙の型変換が発生する。
printf( "[4]\n" );
RequireFloat ( d );
RequireDouble( f );
return 0;
}