#include <iostream>

template<typename A, typename B, typename C>
C mymin (const A& a, const B& b)
{
  if ( a < b )
      return (C) a;
  else
      return (C) b;
}

int main()
{
    double val1 = 66.8, val2 = 75.4 ;

    std::cout << "min of " << val1 << " and " << val2 << " is: "
               << mymin<int,double,double>( val1, val2 ) << '\n' ;

    std::cout << "min of " << val1 << " and " << val2 << " is: "
               << mymin<double,int,double>( val1, val2 ) << '\n' ;

    std::cout << "min of " << val1 << " and " << val2 << " is: "
               << mymin<double,double,char>( val1, val2 ) << '\n' ;

    char a[] = "12345", b[] = "abcde" ;
    std::cout << "min of " << a << " and " << b << " is: "
               << mymin<char*,char*,char*>( a, b ) << '\n' ;

    char c[] = "abcde", d[] = "12345" ;
    std::cout << "min of " << c << " and " << d << " is: "
               << mymin<char*,char*,char*>( c, d ) << '\n' ;
}
